ffmpeg 视频编码及基本知识

理论

H264编码原理(简略)

1. 视频为什么需要进行编码压缩

降低视频数据大小,方便存储和传输

2. 为什么压缩的原始数据采用YUV格式

彩色图像的格式是 RGB 的,但RGB 三个颜色是有相关性的。
采用YUV格式,利用人对图像的感觉的生理特性,对于亮度信息比较敏感,而对于色度信息不太敏感,所以视频编码是将Y分量和UV分量分开来编码的,并且可以减少UV分量,比如我们之前说的YUV420P。y黑白分量 uv色度分量 即4个y对应一个uv为一组,大大符合了1。

3. 视频压缩原理

编码的目的是为了压缩,各种视频编码算法都是为了让视频体积变得更小,减少对存储空间和传输带宽的占用。编码的核心是去除冗余信息,通过以下几种冗余来达到压缩视频的目的:
1. 空间冗余:局部区域压缩 “区域动态 其他区域静态”
2. 时间冗余:帧之间的压缩
3. 视觉冗余:块之间的压缩
4. 编码冗余(信息熵冗余):较少bit 比如有20个1000 我可以用1表示 有10个2 用2表示。
4. I、P、B帧 GOP图像序列

略 详细参考下方链接

5.H264编码原理

对于每一帧图像,是划分为一个个块进行编码,就是我们说的宏块。
1. 宏块扫描  核心思想:数字越小越容易用更少的bit做压缩。
2. 帧内预测    核心思想:宏块相似率很高,直接cp一份块减去差值。又分水平和垂直预测,src-xp = dst  src = dst + xp(xp就是预测算法 src原始块 dst预测块)
3.帧间预测 与帧内相似
4.DCT 变换和量化 核心思想:不只是将像素值变小,而是希望能出现连续的 0 像素。 一句话就是宏块有差不多特性,往0靠拢,这是有损压缩。 比如 12 13 4 -> 0 1 0  4这个就丢失了,画质就抽象了。所以下列qp qstep对图像质量起到关键性作用。
QP 是量化参数,它控制编码过程中的量化强度。QP 值越高,量化的步长越大,编码后的视频质量越低,但文件大小也越小;相反,QP 值越低,量化的步长越小,编码后的视频质量越高,但文件大小也越大。
QStep 通常指的是量化步长,它与 QP 值相关,更具体地表示了量化过程中的缩放因子。

 

具体可看

H264分析-CSDN博客

h264视频编码原理总结

◼ 为了能够在最后熵编码的时候压缩率更高,对于送到熵编码(以行程编码为例)的“像素串”,包含的0越多,越能提高压缩率。为了达到这个目标:
◼ 先通过帧内预测或者帧间预测去除空间冗余和时间冗余,从而得到一个像素值相
比编码块小很多的残差块。
◼ 然后再通过 DCT 变换将低频和高频信息分离开来得到变换块然后再对变换块的系数做量化。
◼ 由于高频系数通常比较小,很容易量化为 0,同时人眼对高频信息不太敏感,这样就得到了一串含有很多个 0,大多数情况下是一串含有连续 0 的“像素串”,并且人的观感还不会太明显。这样,最后熵编码就能把图像压缩成比较小的数据,以此达到视频压缩的目的。
◼ 这即是视频编码的原理。

H.264 码率设置

什么是视频码率

视频码率是视频数据(包含视频⾊彩量、亮度量、像素量)每秒输出的位数。⼀般⽤的单位是kbps。

设置视频码率的必要性

在⽹络视频应⽤中,视频质量和⽹络带宽占⽤是相⽭盾的。通常情况下,视频流占⽤的带宽越⾼则视频 质量也越⾼,需要的⽹络带宽也越⼤,解决这⼀⽭盾的钥匙当然是视频编解码技术。评判⼀种视频编解 码技术的优劣,是⽐较在相同的带宽条件下,哪个视频质量更好;在相同的视频质量条件下,哪个占⽤ 的⽹络带宽更少(⽂件体积⼩)。

是不是视频码率越⾼,质量越好呢?

理论上是这样的。然⽽在我们⾁眼分辨的范围内,当码率⾼到⼀定 程度时,就没有什么差别了。所以码率设置有它的最优值,H.264(也叫AVC或X264)的⽂件中,视频 的建议码率如下:

ffmpeg 码率控制

CQP:Constant Quantization Parameter - 固定质量参数(恒定质量1-pass)

恒定QP是最简单的码率控制方式,把某个量化值QP作为目标,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量大小是未知的。常用于算法研究阶段,算法的验证。

CBR:Constant BitRate - 固定比特率 是恒定(固定)比特率,指文件每秒钟的码率是固定不变的。

VBR:Variable BitRate - 动态比特率

单位时间内的码率是可变的,使用VBR编码时,系统将自动为内容的简单部分分配较少的比特,从而留 出足量的比特用于生成高质量的复杂部分。

ABR:Average Bitrate - 平均码率 平均比特率(平均比特率,CBR和VBR的折衷)

Lame针对CBR不佳的文件体积比和VBR生成文件大小不定的特点 独创了这种编码模式。ABR也 被称为“Safe VBR”,它是在指定的平均Bitrate内,以每50帧(30帧约1 秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量。

总结

CBR的特点是码率平稳,固定码流控制可以减少网络抖动的影响,不大起大落,适合网络直播。 

VBR的特点是码率波动起伏较大,但总体省空间,主要用来存储。网络条件非常好的情况下也是可以用的。 

实际网络传输中所谓的 CBR 一般都是 ABR(平均比特率),即只要是单位时间内把码率控制在额定码率就可以了,因为编码输出本来就有缓冲可以起到平滑波动的作用;ABR 是最适合网络传输的方案;

H264编码控制 

ffmpeg中采用H264,H265标准编码时,可能需要设置profile、preset和tune。

1 选择⼀个CRF值

量化⽐例的范围为0~51,其中0为⽆损模式,23为缺省值,51可能是最差的。该数字越⼩,图像质量越 好。从主观上讲,18~28是⼀个合理的范围。18往往被认为从视觉上看是⽆损的,它的输出视频质量和输 ⼊视频⼀模⼀样或者说相差⽆⼏。但从技术的⻆度来讲,它依然是有损压缩。

若CRF值加6,输出码率⼤概减少⼀半;若CRF值减6,输出码率翻倍。通常是在保证可接受视频质量的前 提下选择⼀个最⼤的CRF值,如果输出视频质量很好,那就尝试⼀个更⼤的值,如果看起来很糟,那就尝 试⼀个⼩⼀点值。

2选择⼀个preset和tune

"编码速度"通常指的是将原始音视频数据转换成压缩格式(编码格式)的速度。这个过程包括两个主要方面:

  1. 压缩速度:这是编码速度的一部分,指的是音视频数据被压缩成特定编码格式(如 H.264、H.265、VP9 等)的速度。压缩速度越快,处理相同数据量所需的时间就越短。

  2. 编码效率:除了压缩速度,编码效率也是一个重要的考量因素。编码效率涉及到在保持视频质量的同时,尽可能减少输出文件的大小。有些编码器可能在压缩速度上表现不错,但输出的文件相对较大,或者在保持文件大小的同时牺牲了视频质量。

 preset预设是⼀系列参数的集合,这个集合能够在编码速度和压缩率之间做出⼀个权衡

⽬前所有的预设按照编码速度降序排列为:
ultrafast
superfast
veryfast
faster
fast
medium – default preset
slow
slower
veryslow
placebo - ignore this as it is not useful (see FAQ)
默认为medium级别。av_opt_set(codec_ctx->priv_data, "preset", "medium", 0);

 

tune主要配合视频类型和视觉优化的参数况。如果视频的内容符合其中一个可用的调整值又或者有其中需 要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。

当前的 tune包括:
film:电影类型,对视频的质量⾮常严格时使⽤该选项
animation:动画⽚,压缩的视频是动画⽚时使⽤该选项
grain:颗粒物很重,该选项适⽤于颗粒感很重的视频
stillimage:静态图像,该选项主要⽤于静⽌画⾯⽐较多的视频
psnr:提⾼psnr,该选项编码出来的视频psnr⽐较⾼
ssim:提⾼ssim,该选项编码出来的视频ssim⽐较⾼
fastdecode:快速解码,该选项有利于快速解码
zerolatency:零延迟,该选项主要⽤于视频直播av_opt_set(codec_ctx->priv_data, "tune","zerolatency",0); // 直播是才使用该设置

profile

H.264有四种画质级别,分别是baseline, extended, main, high:

所有的profile 包括:
1. baseline profile:基本画质。⽀持I/P 帧,只⽀持⽆交错(Progressive)和CAVLC;
2. extended profile:进阶画质。⽀持I/P/B/SP/SI 帧,只⽀持⽆交错(Progressive)和CAVLC;
3. main profile:主流画质。提供I/P/B 帧,⽀持⽆交错(Progressive)和交错(Interlaced),也⽀持CAVLC 和CABAC 的⽀持;
4. high profile:⾼级画质。在main Profile 的基础上增加了8x8内部预测、⾃定义量化、 ⽆损视频编码和更多的YUV 格式;

在相同配置情况下,High profile(HP)可以⽐Main profile(MP)节省10%的码流量,⽐MPEG-2MP节省60%的码流量,具有更好的编码性能。根据应⽤领域的不同:
baseline profile多应⽤于实时通信领域;
main profile多应⽤于流媒体领域;
high profile则多应⽤于⼴电和存储领域。

av_opt_set(codec_ctx->priv_data, "profile", "main", 0); // 默认是high

 使用场景总结

1.对于1-pass编码,可以使用CQP,ABR,CBR,CRF或无损编码(尽量避免使用ABR,ABR质量无法保证)。
2.如果对比特率较敏感(例如流媒体),最好的选择是设置码率上限的CRF(CRF + VBV)或CBR。 (OBS默认使用的是CBR模式)
3.对于2-pass以上次数的编码,ABR和CBR用于1-pass生成log文件,将ABR,VBR或CBR用作后续pass的编码。
4.x264中,只有ABR和CBR可用于生成1-pass的log文件。

Tips:
1.视频本地保存(保证质量)——使用CRF保证想要的质量
2.视频点播(确保视频不超过特定大小)——2-pass的最优CRF值(由于是点播,所以有时间调整得到最优CRF值)+VBV或者ABR+VBV限制比特数
3.直播流(要求保证质量+快速编码+带宽)——1-pass的CRF+VBV或者ABR+VBV限制比特数,或者在比特允许的情况下可以使用CBR
4.确保视频最终具有特定大小——2-pass ABR

ffmpeg 视频编码常用函数

几乎与音频编码类似 我们着重看一下视频编码专用api
1.计算指定像素格式、图像宽、图像⾼所需的内存⼤⼩
int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align)
此函数的功能是按照指定的宽、⾼、像素格式来分配图像内存。2.int av_image_alloc(uint8_t *pointers[4], int linesizes[4], int w, int h, enum AVPixelFormat pix_fmt,
int align);
pointers[4]:保存图像通道的地址。如果是RGB,则前三个指针分别指向R,G,B的内存地址。
第四个指针保留不⽤ linesizes[4]:保存图像每个通道的内存对⻬的步⻓,即⼀⾏的对⻬内存的宽度,
此值⼤⼩等于图像宽度。
返回值:所申请的内存空间的总⼤⼩。如果是负值,表示申请失败。3.填充图像数据到一个或多个图像缓冲区中。这些缓冲区可以是帧缓冲区,用于存储视频帧的图像数据。
int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], const uint8_t *src, enum AVPixelFormat pix_fmt, int width, int height, int align);av_image_fill_arrays()中参数具体说明: 简单理解:填充目标 填充格式 数据源 3个图像规则 字节对齐
dst_data[4]: [out]对申请的内存格式化为三个通道后,分别保存其地址
dst_linesize[4]: [out]格式化的内存的步⻓(即内存对⻬后的宽度)
*src: [in]av_alloc()函数申请的内存地址。
pix_fmt: [in] 申请 src内存时的像素格式
width: [in]申请src内存时指定的宽度
height: [in]申请scr内存时指定的⾼度
align: [in]申请src内存时指定的对⻬字节数。

处理流程

参考学习

x264码率控制介绍、配置及应用 - 代码先锋网 (codeleading.com)

ffmpeg 码率控制(总结篇)_ffmpeg码率实时控制-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419033.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇你就是网络安全高手了。

关于我 我算是“入行”不久的一个新人安全工作者,为什么是引号呢,因为我是个“半个野路子”出身。早在13年的时候,我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力,我逐渐淡出了安全圈子&#x…

攻防世界--->回复 1

开学水题笔记(不是,水题。找点,自信心 T^T )。 下载解压查壳。 32ida打开。 进入main函数。 如下: 关键部分: v5的值未知,说明存在于内存中,直接动调就好了。 DUTCTF{We1c0met0DUTCTF}

综合案例-数据可视化-折线图

一、json数据格式 1.1 json数据格式的定义与功能 json是一种轻量级的数据交互格式,可以按照json指定的格式去组织和封装数据,json数据格式本质上是一个带有特定格式的字符串。 功能:json就是一种在各个编程语言中流通的数据格式&#xff0…

MFC工控项目实例之十一板卡测试信号输入界面

承接专栏《MFC工控项目实例之十添加系统测试对话框》 相关代码 1、在BoardTest.h文件中添加代码 class CBoardTest : public CDialog { // Construction public:CBoardTest(CWnd* pParent NULL); // standard constructorCButtonST m_btnStart[16];CWinThread* pThread…

深入FastAPI:掌握使用多个关联模型的高级用法[Union类型]

在FastAPI中,响应模型可以声明为Union类型,这允许你为同一个端点定义多种可能的响应模型。这种灵活性使得API可以根据不同的情况返回不同类型的数据结构。 例如,根据请求中的查询参数或数据库中的数据,一个API端点可能有时返回一…

数学建模_数据预处理流程(全)

数据预处理整体流程图 一般数据预处理流程 处理缺失值:填补或删除缺失值。处理异常值:检测并处理异常值。数据编码:将分类变量进行标签编码或独热编码。数据标准化/归一化:对数据进行标准化或归一化处理。连续变量离散化&#xff…

微信小程序页面制作——个人信息

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

在Unity环境中使用UTF-8编码

为什么要讨论这个问题 为了避免乱码和更好的跨平台 我刚开始开发时是使用VS开发,Unity自身默认使用UTF-8 without BOM格式,但是在Unity中创建一个脚本,使用VS打开,VS自身默认使用GB2312(它应该是对应了你电脑的window版本默认选取了国标编码,或者是因为一些其他的原因)读取脚本…

代码执行漏洞-Log4j2漏洞 vulhub CVE-2021-44228

步骤一:执行以下命令启动靶场环境并在浏览器访问!!! 查看端口 浏览器访问 可以发现 /solr/admin/cores?action 这⾥有个参数可以传,可以按照上⾯的原理 先构造⼀个请求传过去存在JNDI注⼊那么ldap服务端会执⾏我们传上去的payload JDNI项⽬地址 https://github.com…

git的使用和gdb工具

1.git的使用 首先现在gitee上新建一个仓库 然后复制克隆链接到本地仓库 在本地仓库中,我们可以用git status查看仓库状态 我们要提交代码就是要三步 git add 文件名 git commit -m "写提交的日志" git push 将代码上传到远端仓库 然后你就完成一次提…

uuid.js 使用

相关代码 import { NIL } from "uuid";/** 验证UUID* 为空 则返回 false* param uuid* returns {boolean}*/ export function MyUUIDValidate(uuid: any): boolean {if (typeof uuid "string" && uuid ! NIL) { //uuid ! NIL 判断是否是默认值00…

小白建立个人网站初步尝试

一、VScode 代码是在VScode上运行的&#xff0c;可以看作者另一篇文章&#xff1a;http://t.csdnimg.cn/mOmdF 二、代码基本框架 代码解释<!DOCTYPE html>声明为HTML5文档<html><head>头部元素&#xff0c;不显示在页面<meta charset"utf-8"…

直击智博会,supOS加快发展新质生产力,赋能全球工厂数字化转型

9月6日&#xff0c;第十四届智慧城市与智能经济博览会&#xff08;以下简称智博会&#xff09;开幕主题活动在宁波举办。本届智博会着重围绕“数字赋能新型工业化”主题&#xff0c;设置开幕活动、展览展示和前瞻研讨、产数合作、赛事赋能、开放活动等4大板块活动&#xff0c;旨…

windows 环境下搭建mysql cluster 集群详细步骤

1、环境准备 下载mysql集群版本&#xff0c;我这里下载的是mysql-cluster-8.0.39-winx64 https://dev.mysql.com/downloads/cluster/ 2、创建配置文件 mysql集群版本下载以后解压后目录如下&#xff0c;创建配置文件 config.ini(集群配置文件&#xff0c;my.ini mysql配置…

如何把自动获取的ip地址固定

在大多数网络环境中&#xff0c;‌设备通常会自动从DHCP服务器获取IP地址。‌这种动态分配IP的方式虽然灵活方便&#xff0c;‌但在某些特定场景下&#xff0c;‌我们可能需要将设备的IP地址固定下来&#xff0c;‌以确保网络连接的稳定性和可访问性。‌本文将详细介绍如何把自…

单GPU一分钟生成16K高清图像!新加坡国立发布LinFusion:无缝兼容Stable Diffusion插件

论文链接&#xff1a;https://arxiv.org/pdf/2409.02097 Git链接&#xff1a;https://lv-linfusion.github.io/ 亮点直击 本文研究了Mamba的非因果和归一化感知版本&#xff0c;并提出了一种新颖的线性注意力机制&#xff0c;解决了扩散模型在高分辨率视觉生成中的挑战。 本文…

oracle数据库安装和配置

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Oracle 数据库的安装和配置是一个较为复杂的过程&#xff0c;涉及多个步骤和配置项。以下将详细介绍如何在 Linux 和 Windows 系统中安装 Oracle 数据库并进行基础配置。 一、Oracle 数据库安装前的准备 …

如何使用微软的Copilot AI工具将Word文档转换为PowerPoint

Copilot 让你可以将 Word 文档转换为 PowerPoint 演示文稿&#xff0c;使你能够以最小的努力制作出有针对性的演示文稿。这个功能是微软AI工具包的一部分&#xff0c;对于那些曾经盯着空白幻灯片不知道从何开始的人来说&#xff0c;这是一个颠覆性的改变。要充分利用这个工具&a…

【web网页制作】html+css旅游家乡河南主题网页制作(5页面)【附源码】

一、&#x1f468;‍&#x1f393;网站题目 旅游&#xff0c;当地特色&#xff0c;历史文化&#xff0c;特色小吃等网站的设计与制作。 二、✍️网站描述 &#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS 等来完成页面的排版设计&#x1f469;‍&#x1f393;…

Elasticsearch:无状态世界中的数据安全

作者&#xff1a;来自 Elastic Henning Andersen 在最近的博客文章中&#xff0c;我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储&#xff08;例如 Amazon S3&#xff09;&#xff0c;我们获得了许多优势和简化。 从历史上…