如何在 Media Foundation 中从 MP4 和 x264 流中提取颜色矩阵
How do I extract color matrix from MP4 an x264 stream in Media Foundation
我正在使用媒体基础使用自定义播放器播放视频(包含 x264 编码视频流的 mp4)。
当我将 YUV 信息转换为 RGB 时,我需要考虑编码时使用的颜色矩阵和范围。
我的一些视频有这个信息,我可以使用 MediaInfo.exe 或 FFMPEG 来查看它是否存在。
但是,对于此类视频,如果我查看相关的 Media Foundation 属性 (Extended Color Information),文件中不存在这些属性。
因此,我需要以某种方式找到访问信息的方法。
Media Foundation 确实提供对视频流的 MF_MT_MPEG4_SAMPLE_DESCRIPTION 和 MF_MT_MPEG_SEQUENCE_HEADER 的访问,但我找不到对这些内容的描述。
我注意到 MF_MT_MPEG_SEQUENCE_HEADER 对于包含当前信息的视频来说要长得多,这个 (MPEG Headers Quick Reference) 似乎表明 header 可能包含我需要的信息。
我正在寻找色彩范围 (limited/full)、原色、传输特性和矩阵系数(BT.709 等)。
对于从 Media Foundation 视频流中查找此信息的任何帮助,我将不胜感激。
谢谢
朱尔斯
更新 - 序列 Header
序列 header 似乎是 MPEG4 样本描述的子集,但我找不到任何表明数据实际包含/不包含具体内容的信息。
序列 header 似乎包含结构为 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 并且可以使用该代码来解码数据。
如果有人对解码此数据有任何直接经验,那将非常有用。
再次感谢
更新 - 相关 posts
我发现这个 How to decode sprop-parameter-sets in a H264 SDP? and Possible Locations for Sequence/Picture Parameter Set(s) for H.264 Stream 非常有用。
序列header看起来是序列或图片参数集(pps),我想要的参数是VUI扩展子集。
加上这个 post H.264 stream structure 给出了流数据结构的高层次,MF_MT_MPEG_SEQUENCE_HEADER 似乎以 NAL 0x00 0x00 0x01 开头所以我猜它是一个包含 PPS 的 NAL。
是的,信息在 VUI 扩展子集中。
因此您需要检查 vui_parameters_present_flag 和 video_signal_type_present_flag。如果未设置这些标志,我认为 h264 规范中的颜色 Range/Color Primaries/Transfer Characteristics/Matrix 系数有默认值。
您还需要从 SPS 中提取信息,为此您需要注意的是学习指数哥伦布编码。
检查此 link :The h.264 Sequence Parameter Set
编辑
也是,MF_MT_MPEG_SEQUENCE_HEADER 当文件是 h264 视频格式时,通常包含 SPS 和 PPS 信息。
(来自 MSDN Forums 的交叉 post)
您可以在 H264StructReader.cpp 中的 GraphStudioNext 以及其他具有可用代码的项目中查找解析 H.264 参数集的示例代码。
GraphStudioNext 也将能够以可视方式提供此信息(colour_primaries 等),只要它可用:
上面的图片显示了一个 GraphStudioNext window,带有 H.264 媒体类型的可视化(对于具有相应 H.264 数据的 MP4 文件),它嵌入了参数集,而参数集又(对于该特定文件)包含一个带有颜色原色和矩阵系数的非空部分。
事实上,即使参数集中存在这些值,Media Foundation 也不会在媒体类型中提供它们(MPEG-4 文件源不添加相应的属性,从参数集中初始化)。
我正在使用媒体基础使用自定义播放器播放视频(包含 x264 编码视频流的 mp4)。
当我将 YUV 信息转换为 RGB 时,我需要考虑编码时使用的颜色矩阵和范围。
我的一些视频有这个信息,我可以使用 MediaInfo.exe 或 FFMPEG 来查看它是否存在。
但是,对于此类视频,如果我查看相关的 Media Foundation 属性 (Extended Color Information),文件中不存在这些属性。
因此,我需要以某种方式找到访问信息的方法。
Media Foundation 确实提供对视频流的 MF_MT_MPEG4_SAMPLE_DESCRIPTION 和 MF_MT_MPEG_SEQUENCE_HEADER 的访问,但我找不到对这些内容的描述。
我注意到 MF_MT_MPEG_SEQUENCE_HEADER 对于包含当前信息的视频来说要长得多,这个 (MPEG Headers Quick Reference) 似乎表明 header 可能包含我需要的信息。
我正在寻找色彩范围 (limited/full)、原色、传输特性和矩阵系数(BT.709 等)。
对于从 Media Foundation 视频流中查找此信息的任何帮助,我将不胜感激。
谢谢
朱尔斯
更新 - 序列 Header
序列 header 似乎是 MPEG4 样本描述的子集,但我找不到任何表明数据实际包含/不包含具体内容的信息。
序列 header 似乎包含结构为 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 并且可以使用该代码来解码数据。
如果有人对解码此数据有任何直接经验,那将非常有用。
再次感谢
更新 - 相关 posts
我发现这个 How to decode sprop-parameter-sets in a H264 SDP? and Possible Locations for Sequence/Picture Parameter Set(s) for H.264 Stream 非常有用。
序列header看起来是序列或图片参数集(pps),我想要的参数是VUI扩展子集。
加上这个 post H.264 stream structure 给出了流数据结构的高层次,MF_MT_MPEG_SEQUENCE_HEADER 似乎以 NAL 0x00 0x00 0x01 开头所以我猜它是一个包含 PPS 的 NAL。
是的,信息在 VUI 扩展子集中。
因此您需要检查 vui_parameters_present_flag 和 video_signal_type_present_flag。如果未设置这些标志,我认为 h264 规范中的颜色 Range/Color Primaries/Transfer Characteristics/Matrix 系数有默认值。
您还需要从 SPS 中提取信息,为此您需要注意的是学习指数哥伦布编码。
检查此 link :The h.264 Sequence Parameter Set
编辑
也是,MF_MT_MPEG_SEQUENCE_HEADER 当文件是 h264 视频格式时,通常包含 SPS 和 PPS 信息。
(来自 MSDN Forums 的交叉 post)
您可以在 H264StructReader.cpp 中的 GraphStudioNext 以及其他具有可用代码的项目中查找解析 H.264 参数集的示例代码。
GraphStudioNext 也将能够以可视方式提供此信息(colour_primaries 等),只要它可用:
上面的图片显示了一个 GraphStudioNext window,带有 H.264 媒体类型的可视化(对于具有相应 H.264 数据的 MP4 文件),它嵌入了参数集,而参数集又(对于该特定文件)包含一个带有颜色原色和矩阵系数的非空部分。
事实上,即使参数集中存在这些值,Media Foundation 也不会在媒体类型中提供它们(MPEG-4 文件源不添加相应的属性,从参数集中初始化)。