音视频基础+ffmpeg原理(视频编码)

H264:

H264压缩比

条件:1、YUV格式YUV420        2、分辨率:640x480        3、帧率15

源码流:640x480x1.5x15,建议码流:500kpbs, 结果:约1/100

码流参考值:https://docs.agora.io/cn

GOP:

gop就是把相似的图片进行分组,一组就是一个gop。

 H264中的I帧、P帧、B帧:

        I帧(intraframe frame),关键帧,采用帧内压缩技术。IDR帧属于I帧。而且IDR帧还是第一帧(GOP中的第一帧),主要是用卡解决错误循环。

        P帧(forward Predicted frame),向前参考帧。压缩时,只参考前面已经处理的帧,采用帧间压缩技术。它占I帧的一般大小。

        B帧(Bidirectionall predicted frame),双向参考帧。压缩时,即参考前面已经处理的帧,也参考后面的帧,采用帧间压缩技术,它占I帧的1/4,虽然占用的内存少,但是比较消耗CPU,延迟大;所以一些实时通讯的场景中B帧用的比较少。     

IDR帧与I帧的区别和联系

        IDR(Instantaneous Decorder Refresh)解码器立即刷新,假如视频某个地方出错,但是在IDR帧的时候,在解码器端会把缓冲区的数据全部清空,重新开始。

        每当遇到IDR帧时,   解码器就会清空解码器参考buffer中的内容

        每个GOP中的第一帧就是IDR帧

        IDR帧是一种特殊的I帧

 播放顺序:IBBBPBBB ,解码顺序:IPBBBPBBB。

SPS与PPS:

        这两个相当于GOP的头文件,放在IRD帧的前面。

        SPS(Sequencd ParameterSet):

               序列参数集,作用于一串连续的视频图像。如 seq_parameter_set_id、帧数及POC(picture order count)的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等。相当于修饰一组帧

        PPS(Picture Parameter Set):

                图像参数集,作用于视频序列中的图像。如pic_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等。相当于修饰图像的。

H264中的宏块:

        1帧内压缩技术,解决的是空域数据冗余问题(比如人眼对于亮度敏感,色度不敏感,我们就可以对色度进行压缩)

        2、  帧间压缩,解决的是时域数据冗余问题(运动矢量、偏差值等)

       3、整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化

        4、CABAC压缩

上面的1、2是属于有损压缩,3、4属于无损压缩。

宏块:就是视频压缩的操作的基本单元,无论是帧内压缩还是帧间压缩,它们都是以宏块为单位。

 左上角就是一个宏块8x8的像素。

 帧内压缩的理论:

        1、相邻的像素差别不大,所以可以进行宏块预测

       2、人们对亮度的敏感度超过色度

        3、YUV很容易将亮度和色度分开

有9中预测模式:

 

 比如第一个,预测出了上、左的数据,我们只需要存储这两排数据,中间的数据可以预测出来,这样存储的数据就非常少了。

 上图的左边是预测后的图,右边是原始图;但是还存在差距,这是因为我们缺少残差值。一般我们解码后会把预测图和原始图进行比较得出残差值。所以简单来说就是:原始图 = 预测图+残差值。

帧内压缩的帧类型: I帧、IDR帧 

帧间压缩原理:

        1、GOP

        2、参考帧

        3、运动估计(宏块匹配+运动矢量)

        4、运动补偿(解码时补上残差值)

对于上图前两张图片,我们只需要找出不同的望远镜,并把望远镜的运动轨迹记录下来,对于第二张图片存储望远镜的运动矢量就行,其他相同的不需要存储。

 解码后,通过运动矢量解码出来的图片,还要与参考帧进行比较补上残差值

视频花屏的原因:

        如果GOP分组中有帧丢失,会造成解码端的图像发生错误,这会出现马赛克(花屏

视频卡顿的原因:

        为了避免花屏问题的发生,当发现有帧丢失时,就丢弃GOP内所有的帧,直到下一个IDR帧重新刷新图像。I帧的按照帧周期来的,需要一个比较长的时间周期,如果在下一个I帧来之前不显示后来的图像,那么视频就静止不动了,这就是出现了所谓的卡顿现象

无损压缩:

        

 离散余弦变换简称为DCT变换。它可以将L*L的图像块从空间域变换为频率域。

经过DCT变换后的结果。从图中可以看出经过DCT变换后,左上角的低频系数集中了大量能量,而右下角的高频系数上的能量很小。

信号经过DCT变换后需要进行量化。由于人的眼睛对图像的低频特性比如物体的总体亮度之类的信息很敏感,而对图像中的高频细节信息不敏感,因此在传送过程中可以少传或不传送高频信息,只传送低频部分。量化过程通过对低频区的系数进行细量化,高频区的系数进行粗量化,去除了人眼不敏感的高频信息,从而降低信息传送量。因此,量化是一个有损压缩的过程,而且是视频压缩编码中质量损伤的主要原因。

量化的过程可以用下面的公式表示:

其中FQ(u,v)表示经过量化后的DCT系数;F(u,v)表示量化前的DCT系数;Q(u,v)表示量化加权矩阵;q表示量化步长;round表示归整,即将输出的值取为与之最接近的整数值。

合理选择量化系数,对变换后的图像块进行量化后的结果如图所示。

量化后的DCT系数

DCT系数经过量化之后大部分经变为0,而只有很少一部分系数为非零值,此时只需将这些非0值进行压缩编码即可。

熵编码:

        熵编码是因编码后的平均码长接近信源熵值而得名。熵编码多用可变字长编码(VLC,Variable Length Coding)实现。其基本原理是对信源中出现概率大的符号赋予短码,对于出现概率小的符号赋予长码,从而在统计上获得较短的平均码长。可变字长编码通常有霍夫曼编码、算术编码、游程编码等。其中游程编码是一种十分简单的压缩方法,它的压缩效率不高,但编码、解码速度快,仍被得到广泛的应用,特别在变换编码之后使用游程编码,有很好的效果。

混合编码:

        上面介绍了视频压缩编码过程中的几个重要的方法。在实际应用中这几个方法不是分离的,通常将它们结合起来使用以达到最好的压缩效果。下图给出了混合编码(即变换编码+ 运动估计和运动补偿+ 熵编码)的模型。该模型普遍应用于MPEG1,MPEG2,H.264等标准中。

混合编码模型

从图中我们可以看到,当前输入的图像首先要经过分块,分块得到的图像块要与经过运动估计的预测图像相减得到差值图像X,然后对该差值图像块进行DCT变换和量化,量化输出的数据有两个不同的去处:一个是送给熵编码器进行编码,编码后的码流输出到一个缓存器中保存,等待传送出去。另一个应用是进行反量化和反变化后的到信号X’,该信号将与运动补偿输出的图像块相加得到新的预测图像信号,并将新的预测图像块送至帧存储器。

 H264码流结构:

        H264码流分层:

                1、NAL层:Network Abstraction Layer,视频数据网络抽象层。主要是解决在码流在网络传输中出现的各种问题

                2、VCL层:视频数据编码层

 码流基本概念:

        1、SODB(String Of Data Bits)

        原始数据比特流,长度不一定是8 的倍数,故需要补齐。它是由VCL层产生的。

        2、RBSP (Raw Byte Sequence Payload)

        SODB + trailing bits,算法是如果SODB最后一个字节不对齐,则补1和多个0。按照字节对齐,使得SODB是8的整数倍

        3、NALU

        NAL Header(1Bit)+RBSP


​​​​​​​

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++ 2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。 第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2 各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1 音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1 个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1 个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21 1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32 2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1 按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual 2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86 2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87 2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1 比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6 选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值