ffmpeg - 每帧的宏块数不同

时间:2018-06-17 15:28:14

标签: ffmpeg frame mpeg video-compression

我正在研究 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 - #“灰色”宏块

这可能吗?为什么?

1 个答案:

答案 0 :(得分:0)

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

使用 av_log()

libavcodec/mpegutils.c日志,其中 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回调以规避两个限制,根据当前线程登录到不同的缓冲区。