ffmpeg - 每帧不同数量的宏块

ffmpeg - Different number of macroblocks per each frame

我正在研究 MPEG 压缩,特别是 "labeled" 使用 ffmpeg 的宏块如何,使用命令:

ffmpeg -debug mb_type -i 输入.mp4 输出.mp4

从理论上讲,我知道通常一个宏块是一个 16x16(像素)块。

所以如果一个框架是例如1920x1080 我想宏块是

(1920*1080)/(16*16) = 8100

现在,分析 ffmpeg 报告,我发现对于每一帧,都有许多更少的宏块(标有一些 "characters" 以表明它们的类型)。

你能解释一下为什么会这样吗? 是(我的)理论错误吗?

我看到 "visualizing" 宏块 -debug vis_mb_type 有一些 灰色 块..对应于不满足任何标准的(宏)块 ffmpeg正在寻找..也许在我的例子中,每一帧都有

8100 - #"gray" macroblocks

这可能吗?为什么?

这与灰色宏块无关,灰色宏块是 IS_SKIP and/or IS_DIRECT(wiki 页面似乎不是最新的)。

libavcodec/mpegutils.c 使用 av_log() 的日志,而 行数限制LINE_SZ = 1024 个字符。如果减去第一个 -debug mb_type header:

所需的字符
New frame, type: B [h264 @ 000001c0241c1cc0]

也就是46个字符。 1024 - 46 = 978。每个宏块记录 3 个字符,因此 978/3 = 326 mbs 适合一行而不截断,相当于 326*16 = 5216 像素,对于大多数用例来说应该 足够 .

此外,日志 来自不同线程的消息似乎混淆了 。为防止这种情况,必须使用 -thread_type none.

禁用帧 and/or 切片级线程

您也可以实现自己的 av_log 回调来规避这两个限制,根据当前线程登录到不同的缓冲区。