【问题标题】:ffmpeg - Different number of macroblocks per each frameffmpeg - 每帧不同数量的宏块
【发布时间】:2018-06-17 15:28:13
【问题描述】:

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

这可能吗?为什么?

【问题讨论】:

    标签: ffmpeg frame mpeg video-compression


    【解决方案1】:

    这与灰色宏块无关,即 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 回调来规避这两个限制,根据当前线程登录到不同的缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 2021-08-15
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多