video - ffmpeg - 使用 -debug mb_type 命令检索视频宏块信息
问题描述
我正在尝试获取有关视频(mp4)帧中所有宏块的信息。特别是我正在使用ffmpeg命令:
ffmpeg -debug mb_type -i input.mp4 out.mp4 2> macroblocks.txt
它似乎工作正常,但是......我不明白如何解析输出!
我看到在写了很多无趣的文章之后,开始了一组以
“新框架,类型:[FRAME TYPE]”
所以我假设这些块是指包含每个宏块类型的每个帧的块..但是里面的符号是什么意思?
新框架,类型:B [h264@000001c0241c1cc0] d < X- < I > > > X ddddd < < d < d > < dd > d < ddd < > < d < > X < dd > d X d < > d X d > > d d+ d
从理论上我知道有帧内或预测的宏块,但我不明白如何从“新帧”块中解析这些信息。
- i,I,A,<,>,X,|等是什么意思?
也经常有这样的句子
nal_unit_type:1(非IDR图片的编码切片),nal_ref_idc:2
或者
cur_dts 无效(如果在每个流开始时出现一次,这是无害的)
我真的不明白...我也找不到文档..有人可以帮助我吗?
解决方案
最好的文档似乎是源代码,目前从libavcodec/mpegutils.c 的第 196 行开始。我不会在这里复制所有内容,仅足以理解上面给出的示例行。
每个宏块由 3 个字符描述:
类型和运动矢量方向
- d:
IS_DIRECT && IS_SKIP
- <:
!USES_LIST(0)
- 对未来的引用(列表 1,B 切片) - X:
USES_LIST(0) && USES_LIST(1)
- 参考过去和未来(列表 1 和 2,B 切片) - >:
!USES_LIST(1)
- 对过去的引用(列表 0、P 或 B 切片) - 有关更多信息,请参阅代码
- d:
分割
- +:
IS_8X8
- -:
IS_16X8
- |:
IS_8X16
- 空间:
IS_INTRA || IS_16X16
- ?: 否则
- +:
隔行扫描
- =:
IS_INTERLACED
- 空格:不交错
- =:
在这方面也很有趣的是ffmpeg 本身内置的宏块类型可视化。
对于 NAL 单元类型,请参见此处的表 7-1。
推荐阅读
- javascript - React - 将类添加到空输入字段
- ruby-on-rails - 在运行迁移时修改了结构.sql 文件,添加了一些东西
- java - Java 11 JLink 出现错误:自动模块不能与 jlink 一起使用:来自文件的 com.microsoft.sqlserver.jdbc
- oracle - Oracle:无法在 unicode 和非 unicode 字符串数据类型之间转换?
- google-apps-script - 有没有办法通过脚本通过固定宽度拆分列?尝试解析数据
- python - 如何从数据集中的行创建 pdf 并保存它们
- php - 加载代理模块时,Docker 中的 Apache 2.4 httpd 未启动
- php - 如何在 localhost:8000 中从 Laravel 的一个项目更改为另一个项目?
- c# - 数据库上下文结果显示来自继承类的“无效列名'鉴别器'”
- node.js - 如何从 hapijs 路由处理程序中的事件回调返回结果(版本 17+)