场编码MBAFF相关

场编码MBAFF相关

宏块与宏块对 假设 A、B 是上下相邻的两个 MB: 在非宏块对的情况下:A、B宏块序号不连续,相差图像一行宏块个数。即按光栅扫描顺序编号。 在帧宏块对的情况下:A、B宏块序号连续,即按锯齿扫描顺序编号。A、B 组成不变。A 称为顶帧宏块,B 称为低帧宏块。 在场宏块对的情况下:A、B宏块序号连续,即按锯齿扫描顺序编号。但是这个时候的 A 是由原来 A、B 两个宏块中的奇数行像素组成,称为顶场宏块;而 B 是由原来 A、B 两个宏块中的偶数行像素组成,称为低场宏块。

 

一幅图像编码可以分为三种:非 MBAFF 帧、场、MBAFF 帧。 一幅图像中宏块的存在方式有两种: 1、图像中的所有宏块以单个宏块的方式独立存在。也就是上面第三个图中非宏块对的情况。 2、图像中的所有宏块都是两两成对出现,上下相邻的两个为一对。也就是上面第三个图中宏块对的情况。 第一种宏块存在方式出现在非 MBAFF 帧图像(可以称为普通帧)和场图像中,第二种宏块存在方式出现在 MBAFF 帧图像中 第二种宏块存在方式又分为两种:帧宏块对(上面第一个图)和场宏块对(上面第二个图)

 

  1. MBAFF时相邻宏块的获取过程

以标准(200503版)中表 6-4 的第一行为例进行说明,其余情况可依此做类似分析:

 

当 currMbFrameFlag = 1,mbIsTopMbFlag = 1
1、确定当前宏块左上角像素在帧图像中对应的像素点:
currMbFrameFlag = 1,mbIsTopMbFlag = 1:当前宏块为顶帧宏块,其左上角像素的对应像素点(co-located pixel)为 c
2、根据当前宏块的属性来确定相邻像素点:
因为当前宏块为顶帧宏块,所以 c 的左上角相邻像素点为 a
3、确定相邻像素点所属宏块对:
因为宏块对是用顶宏块的地址表示,所以像素点 a 所属宏块对为 mbAddrD,因此表 6-4 中 mbAddrX = mbAddrD
4、根据相邻宏块对的属性来确定相邻像素点所属宏块:
(1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 a 属于宏块 mbAddrD+1
结论:当前宏块的左上相邻宏块为 mbAddrD+1,因此表 6-4 中:mbAddrN = mbAddrD+1
(2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 a 在场图像时(即进行隔行抽取后)属于宏块mbAddrD+1
结论:当前宏块的左上相邻宏块为 mbAddrD+1,因此表 6-4 中:mbAddrN = mbAddrD+1

当 currMbFrameFlag = 1,mbIsTopMbFlag = 0

1、确定当前宏块左上角像素在帧图像中对应的像素点:
currMbFrameFlag = 1,mbIsTopMbFlag = 0:当前宏块为低帧宏块,其左上角像素的对应像素点(co-located pixel)为 f
2、根据当前宏块的属性来确定相邻像素点:
因为当前宏块为低帧宏块,所以 f 的左上角相邻像素点为 e
3、确定相邻像素点所属宏块对:
因为宏块对是用顶宏块的地址表示,所以像素点 e 所属宏块对为 mbAddrA,因此表 6-4 中 mbAddrX = mbAddrA
4、根据相邻宏块对的属性来确定相邻像素点所属宏块:
(1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 e 属于宏块 mbAddrA
结论:当前宏块的左上相邻宏块为 mbAddrA,因此表 6-4 中:mbAddrN = mbAddrA
(2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 e 在场图像时(即进行隔行抽取后)属于宏块 mbAddrA+1
结论:当前宏块的左上相邻宏块为 mbAddrA+1,因此表 6-4 中:mbAddrN = mbAddrA+1

当 currMbFrameFlag = 0,mbIsTopMbFlag = 1

1、确定当前宏块左上角像素在帧图像中对应的像素点:
currMbFrameFlag = 0,mbIsTopMbFlag = 1:当前宏块为顶场宏块,其左上角像素的对应像素点(co-located pixel)为 c
2、根据当前宏块对的属性来确定相邻像素点:
因为当前宏块为顶场宏块,所以 c 的左上角相邻像素点为 b
3、确定相邻像素点所属宏块对:
因为宏块对是用顶宏块的地址表示,所以像素点 b 所属宏块对为 mbAddrD,因此表 6-4 中 mbAddrX = mbAddrD
4、根据相邻宏块对的属性来确定相邻像素点所属宏块:
(1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 b 属于宏块 mbAddrD+1
结论:当前宏块的左上相邻宏块为 mbAddrD+1,因此表 6-4 中:mbAddrN = mbAddrD+1
(2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 b 在场图像时(即进行隔行抽取后)属于宏块 mbAddrD
结论:当前宏块的左上相邻宏块为 mbAddrD,因此表 6-4 中:mbAddrN = mbAddrD

当 currMbFrameFlag = 0,mbIsTopMbFlag = 0

1、确定当前宏块左上角像素在帧图像中对应的像素点:
currMbFrameFlag = 0,mbIsTopMbFlag = 0:当前宏块为低场宏块,其左上角像素的对应像素点(co-located pixel)为 d
2、根据当前宏块对的属性来确定相邻像素点:
因为当前宏块为低场宏块,所以 d 的左上角相邻像素点为 a
3、确定相邻像素点所属宏块对:
因为宏块对是用顶宏块的地址表示,所以像素点 a 所属宏块对为 mbAddrD,因此表 6-4 中 mbAddrX = mbAddrD
4、根据相邻宏块对的属性来确定相邻像素点所属宏块:
无论 mbAddrX 是帧宏块对还是场宏块对(即无论mbAddrXFrameFlag 值为多少),像素点 a 都属于宏块 mbAddrD+1
(1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 a 属于宏块 mbAddrD+1
结论:当前宏块的左上相邻宏块为 mbAddrD+1,因此表 6-4 中:mbAddrN = mbAddrD+1
(2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 a 在场图像时(即进行隔行抽取后)属于宏块 mbAddrD+1
结论:当前宏块的左上相邻宏块为 mbAddrD+1,因此表 6-4 中:mbAddrN = mbAddrD+1

 

【说明】:
1、这里使用了对应像素点(co-located pixel)的概念,也就是当前像素点在未进行隔行抽取时所对应的位置。我们在帧间宏块的时间 direct 预测模式时候,也会遇到 co-located 这个概念。和这里的含义一样;
2、请大家注意红色文字;
3、宏块与宏块对的概念请参照本论坛的帖子"
[原创] 宏块与宏块对(附图)";
4、请参考标准 6.4.9.2 小节学习。

### 如何在 FFmpeg 中启用 MBAdaptive Frame Field (MBAff) 要在 FFmpeg 中启用 Macroblock Adaptive Frame Field (MBAFF),需要通过特定的命令行参数来设置视频编器的相关选项。以下是详细的说明: #### 启用 MBAFF 的方法 1. **指定编器支持 MBAFF** 使用 H.264器时,可以通过 `-bf` `-flags +ildct+ilme` 参数组合实现帧自适应模式的支持[^1]。 2. **配置 Rate Control 方法** 如果使用的是 x264库,则可以调整 RC(Rate Control)方法以优化性能。例如,在 CRF 模式下运行时,可通过以下方式设定比特率控制策略[^2]: ```bash ffmpeg -i input.mp4 -c:v libx264 -preset slow -tune film -profile:v high -level 4.0 -bf 2 -flags +ildct+ilme -pix_fmt yuv420p output.mp4 ``` 3. **具体参数解释** - `libx264`: 表示使用 x264器。 - `-preset slow`: 设置编速度预设为慢速,提高压缩效率。 - `-tune film`: 调整针对电影素材的最佳化。 - `-profile:v high`: 设定编标准为 High Profile。 - `-level 4.0`: 定义兼容级别为 Level 4.0。 - `-bf 2`: 允许多达两个 B 帧用于预测。 - `-flags +ildct+ilme`: 开启 ILDCT(交错离散余弦变换) ILME(交错运动估计),这是启用 MBAFF 所需的关键标志位[^1]。 4. **关于 SAD 计算的理解补充** 在实际编过程中,宏块的选择会涉及多种算法计算,比如基于 Sum of Absolute Differences (SAD) 来决定最佳匹配块的方式。这通常会在内部调用诸如 `x264_mb_analyse_intra()` 函数完成分析工作[^3]。 #### 示例代片段 下面是一个完整的命令行例子展示如何应用上述参数: ```bash ffmpeg -y -i input.avi \ -c:v libx264 -b:v 5M -minrate 5M -maxrate 5M -bufsize 10M \ -preset veryslow -tune grain -profile:v high -level 4.2 \ -bf 3 -flags +ildct+ilme -partitions parti4x4+partp8x8+partb8x8 \ -me_method umh -me_range 32 -subq 9 -trellis 2 -g 250 -keyint_min 25 \ -sc_threshold 40 -i_qfactor 0.71 -b_strategy 2 -threads auto \ -pix_fmt yuv420p output.mp4 ``` 此脚本设置了较高的复杂度并开启了所有必要的功能来充分利用 MBAFF 技术的优势。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值