0

我正在研究MPEG压缩,特别是如何使用以下命令用 ffmpeg“标记”宏块:

ffmpeg -debug mb_type -i input.mp4 out.mp4

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

因此,如果一帧是例如1920x1080,我认为宏块是

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

现在,分析 ffmpeg 报告,我发现对于每一帧,宏块要少得多(标有一些“字符”,表示它们的类型)。

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

我已经看到使用-debug vis_mb_type “可视化”宏块有一些灰色块..对应于不满足 ffmpeg 正在寻找的任何标准的(宏)块..也许在我的示例中每个帧都有

8100 - #“灰色”宏块

这可能吗?为什么?

4

1 回答 1

0

这与灰色宏块无关,它们是 IS_SKIP 和/或 IS_DIRECT(维基页面似乎不是最新的)。

libavcodec/mpegutils.c使用av_log()记录日志,这又具有LINE_SZ = 1024 个字符的行限制。如果减去第一个-debug mb_type标头所需的字符:

New frame, type: B [h264 @ 000001c0241c1cc0]

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

此外,看起来来自不同线程的日志消息混在一起了。为了防止这种情况,必须使用-thread_type none禁用帧和/或切片级线程。

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

于 2018-06-18T09:43:45.040 回答