【问题标题】:How do I extract color matrix from MP4 an x264 stream in Media Foundation如何在 Media Foundation 中从 MP4 和 x264 流中提取颜色矩阵
【发布时间】:2016-12-25 00:25:52
【问题描述】:

我正在使用媒体基础通过自定义播放器播放视频(包含 x264 编码视频流的 mp4)。

当我将 YUV 信息转换为 RGB 时,我需要考虑编码时使用的颜色矩阵和范围。

我的一些视频有这个信息,我可以使用 MediaInfo.exe 或 FFMPEG 来查看它是否存在。

但是,对于此类视频,如果我查看相关的媒体基金会属性 (Extended Color Information),文件中不存在这些属性。

所以,我需要找到一种访问信息的方法。

Media Foundation 确实提供了对视频流的 MF_MT_MPEG4_SAMPLE_DESCRIPTION 和 MF_MT_MPEG_SEQUENCE_HEADER 的访问权限,但我找不到这些内容的描述。

我注意到 MF_MT_MPEG_SEQUENCE_HEADER 对于包含信息的视频来说要长得多,这 (MPEG Headers Quick Reference) 似乎表明标题可能包含我需要的信息。

我正在寻找颜色范围(有限/完整)、原色、传输特性和矩阵系数(BT.709 等)。

如果能帮助我从 Media Foundation 视频流中查找此信息,我将不胜感激。

谢谢

朱尔斯


更新 - 序列头

序列标头似乎是 MPEG4 示例描述的子集,但我找不到任何指示数据位实际包含/不具体包含的内容。

序列头似乎包含结构化为 MP4 字节流的数据,如 H264 Standards Document 中所述,并包括 VUI(视频可用性信息 - 文档附件 E),其中可能包含我感兴趣的颜色信息。

鉴于它是一个字节流,我需要知道它从哪里开始以及是否有一些现有的代码可以用来对其进行解码。

在 libavcodec/h264_ps.c 中的 FFMPEG 中有一个名为 ff_h264_decode_seq_parameter_set 的函数,它最终会调用 decode_vui_parameters。 seq_parameter_set 似乎有可能映射到 MF_MT_MPEG_SEQUENCE_HEADER 并且可以使用该代码来解码数据。

如果有人对解码这些数据有任何直接经验,那将非常有用。

再次感谢


更新 - 相关帖子

我发现这个How to decode sprop-parameter-sets in a H264 SDP?Possible Locations for Sequence/Picture Parameter Set(s) for H.264 Stream 很有帮助。

序列头似乎是序列或图片参数集 (pps),而我想要的参数是 VUI 扩展子集。

另外,这篇文章H.264 stream structure 提供了流数据结构的高级信息,并且 MF_MT_MPEG_SEQUENCE_HEADER 似乎以 NAL 0x00 0x00 0x01 开头,所以我猜它是一个包含 PPS 的 NAL。

【问题讨论】:

    标签: video ffmpeg mp4 h.264 ms-media-foundation


    【解决方案1】:

    是的,信息在 VUI 扩展子集中。

    所以你需要检查 vui_parameters_present_flag 和 video_signal_type_present_flag。如果没有设置这些标志,我认为 h264 规范中有颜色范围/颜色原色/传输特性/矩阵系数的默认值。

    您还需要从 SPS 中提取信息,并且您需要注意的是学习指数哥伦布编码。

    查看此链接:The h.264 Sequence Parameter Set

    编辑

    也可以,当文件为 h264 视频格式时,MF_MT_MPEG_SEQUENCE_HEADER 通常包含 SPS 和 PPS 信息。

    【讨论】:

    • Somone (Roman R) 在另一个论坛上也指出了我在 GraphStudioNext 中的这个 github.com/cplussharp/graph-studio-next/blob/master/src/… 代码并评论说“确实,即使参数集中存在这些值,Media Foundation 也不会使它们可用在媒体类型中(MPEG-4 File Source 不添加各自的属性,从参数集初始化)。”
    • 是的,MPEG-4 文件源不添加这些相应的属性。你有 MF_MT_MPEG_SEQUENCE_HEADER 和样本数据。例如,典型的 MF_MT_MPEG_SEQUENCE_HEADER 将包含: 00 00 01 67 4d 40 1f da 01 40 16 ec 04 40 00 00 03 00 40 00 00 0c 83 c6 0c a8 00 00 01 68 ef 3c 01 80。第一个 00是 SPS,00 00 01 68 是 PPS。
    【解决方案2】:

    (来自MSDN Forums的交叉帖子)

    您可以在H264StructReader.cpp 的 GraphStudioNext 中查找解析 H.264 参数集的示例代码,以及其他具有可用代码的项目。

    GraphStudioNext 还可以在可用的地方直观地提供这些信息(color_primaries 等):

    上图显示了一个GraphStudioNext 窗口,其中包含 H.264 媒体类型的可视化(对于具有相应 H.264 数据的 MP4 文件),其中嵌入了参数集,而参数集(对于该特定文件)又包含一个非带有原色和矩阵系数的空白部分。

    确实,即使参数集中存在这些值,Media Foundation 也不会使它们在媒体类型中可用(MPEG-4 文件源不添加相应的属性,从参数集中初始化)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2018-05-12
      • 2018-01-03
      • 2021-10-14
      相关资源
      最近更新 更多