参考文章:音视频高手课系列5-h264编码基础(宏块原理)
文章目录
- 使用videoEye分析视频宏块示例
- FFmpeg宏块概念
- 1. 宏块的定义
- 2. 宏块的分类
- I-Macroblocks
- P-Macroblocks
- B-Macroblocks
- 3. 宏块的编码过程
- 1. 运动估计
- 2. 变换与量化
- 3. 熵编码
- 4. 宏块的解码过程
- 1. 熵解码
- 2. 逆量化与逆变换
- 3. 运动补偿
- 5. 宏块在FFmpeg中的应用
- 6. 宏块的优化技术
- 并行处理
- 快速算法
- 7. 注意:宏块的概念既适用于帧内编码,也适用于帧间编码
- 宏块是为了解决帧内压缩问题,还是帧间压缩问题?
- 参考文献
使用videoEye分析视频宏块示例
使用videoEye软件,导入视频,点击单帧解码分析:
量化参数分析:
宏块类型分析:
FFmpeg宏块概念
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。其中,宏块(Macroblock)是视频编码中的一个基本概念,它对应于图像的一个小区域,通常是16x16像素。这篇文章将深入探讨FFmpeg中宏块的概念和应用。
1. 宏块的定义
在视频压缩技术中,宏块是最基本的处理单元。每个宏块通常包含16x16的像素点,这些像素点共享某些参数,例如运动矢量和编码模式等。这种方式极大地减少了必须处理的数据量,同时也提高了编码效率1。
2. 宏块的分类
根据使用场景,宏块可以被分为以下几种类型:
I-Macroblocks
Intra-coded macroblocks。这种类型的宏块是独立编码的,不依赖于其他宏块。
P-Macroblocks
Predicted macroblocks。这种类型的宏块通过参考前面的一个或多个宏块进行编码。
B-Macroblocks
Bi-directional predicted macroblocks。这种类型的宏块通过参考前后两个宏块进行编码。
3. 宏块的编码过程
宏块的编码过程主要包括以下步骤:
1. 运动估计
对于P-Macroblocks和B-Macroblocks,需要进行运动估计来确定参考宏块。这是通过最小化预测误差来完成的。
2. 变换与量化
对预测误差进行DCT(Discrete Cosine Transform 离散余弦)变换,并进行量化操作以进一步压缩数据。
3. 熵编码
最后,对量化后的数据进行熵编码(例如Huffman编码或Arithmetic编码),生成最终的比特流。
在FFmpeg中,可以通过avcodec_encode_video2()
函数进行宏块编码。
4. 宏块的解码过程
宏块的解码过程与编码过程大致相反,主要包括以下步骤:
1. 熵解码
首先,对比特流进行熵解码,得到量化后的数据。
2. 逆量化与逆变换
然后,对数据进行逆量化和IDCT(Inverse Discrete Cosine Transform)操作,恢复出预测误差。
3. 运动补偿
对于P-Macroblocks和B-Macroblocks,需要根据参考宏块进行运动补偿,得到最终的宏块。
在FFmpeg中,可以通过avcodec_decode_video2()
函数进行宏块解码。
5. 宏块在FFmpeg中的应用
FFmpeg提供了一系列API,可以用来处理宏块。例如:
av_frame_get_best_effort_timestamp()
:获取最佳的时间戳,用于同步音视频。av_picture_fill()
:将YUV数据填充到宏块中。
6. 宏块的优化技术
针对宏块的处理,有很多优化技术可以使用:
并行处理
由于每个宏块都是独立的,因此可以在多核CPU或GPU上并行处理宏块,从而显著提高性能。
快速算法
例如,在运动估计阶段,可以使用快速搜索算法(如三步搜索、钻石搜索等)来加速运动矢量的寻找。
7. 注意:宏块的概念既适用于帧内编码,也适用于帧间编码
在视频压缩中,一个帧(Frame)通常被划分为若干个宏块(Macroblock)。每个宏块通常包含16x16个像素点,这些像素点共享某些参数,例如运动矢量和编码模式等。
-
对于帧内编码(I-frame),每个宏块是独立进行编码的,与其他宏块无关。这就像我们在处理一张静态图片一样,将图片分割为多个小区域(即宏块),然后对每个小区域进行独立编码。
-
对于帧间编码(P-frame和B-frame),则需要利用视频序列中时间上的相关性,通过预测当前宏块与参考帧中的宏块之间的差异来实现编码。这种方式可以大大减少冗余信息,从而提高压缩效率。
宏块是为了解决帧内压缩问题,还是帧间压缩问题?
宏块(Macroblock)的概念用于解决视频压缩中的帧内压缩和帧间压缩问题。无论是在帧内编码还是帧间编码中,宏块都扮演着重要的角色。
-
帧内压缩:帧内压缩主要处理的是单一帧内部的数据冗余。每一帧被划分为若干个宏块,然后对每个宏块独立进行DCT(离散余弦变换)和量化等操作,从而实现数据的压缩。由于每个宏块是独立编码的,因此帧内编码也可以看作是一种基于宏块的空间压缩技术。
-
帧间压缩:帧间压缩则是利用连续帧之间的时间相关性来减少数据冗余。通过预测当前宏块与参考帧中的宏块之间的差异(运动估计),并只编码这种差异(运动补偿),从而实现数据的压缩。帧间编码也可以看作是一种基于宏块的时间压缩技术。
。
参考文献
Sikora, T., “The MPEG-4 video standard verification model”, IEEE Transactions on Circuits and Systems for Video Technology, vol. 7, no. 1, pp. 19-31, Feb 1997. ↩︎