我正在研究 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 - #“灰色”宏块
这可能吗?为什么?
答案 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回调以规避两个限制,根据当前线程登录到不同的缓冲区。