如何在Media Foundation

时间:2016-08-18 07:12:25

标签: video ffmpeg mp4 h.264 ms-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)似乎建议标题可能包含我需要的信息。

我正在寻找颜色范围(有限/全部),颜色初级,传输特性和矩阵系数(BT.709等)。

我非常感谢帮助从Media Foundation视频流中找到这些信息。

由于

更新 - 序列标题

序列标题似乎是MPEG4样本描述的一个子集,但我无法找到任何指示数据位实际包含/不具体包含的内容。

序列标题似乎包含如H264 Standards Document中所述的构造为MP4字节流的数据,并且包括VUI(视频可用性信息 - 文档的附件E),其然后可以包括颜色信息I'我很感兴趣。

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

在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。

2 个答案:

答案 0 :(得分:2)

(来自MSDN Forums的交叉帖子)

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

GraphStudioNext还可以直观地提供这些信息(colour_primaries等):

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

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

答案 1 :(得分: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信息。