繁体   English   中英

如何使用MediaStreamSource播放来自matroska文件的h264帧?

[英]How to use MediaStreamSource to play h264 frames coming from a matroska file?

我正在尝试使用MediaStreamSource在Silverlight 3中渲染来自mkv h264文件的帧。 解析mkv文件很好,但是我正在为SL中的CodecPrivateData的期望值挣扎,它必须是字符串,而来自mkv的PrivateData信息是一个二进制元素。 另外,我不确定应以哪种形式将帧提供给SL(即,它们以mkv / mp4格式存储或以代码转换为NALU的方式)是否有人对此有任何信息?

在经历了我自己的类似问题并为之苦恼后,我能够回答这个问题。

  • 在ReportOpenMediaCompleted()中,设置视频流描述时,尽管文档中有说明,您仍可以忽略CodecPrivateData属性字符串。 不是必需的 (假设您的NAL单位流包括SPS和PPS单位)

  • 对于每个GetSampleAsync()请求,应将一个NAL单元发送回MediaElement。 这包括非图片NAL单位,例如SPS / PPS单位。

  • 发送NAL单元时,请确保每个单元的开头都有3字节的起始码(0x00 0x00 0x01)。 (这类似于“附件B”格式,但不完全相同)

  • 在ReportGetSampleCompleted()中,将“偏移”的值设置为等于NAL起始代码的开头,而不是实际数据的开头。 (在大多数情况下,如果您使用每个NAL单位使用新的流,则该值为零)

我已经在这里写了一些有关体验的博客,希望能写更多的博客。

根据文档,编解码器专用数据应设置为00000001 + sps + 00000001 + pps。 但是,文档错误 ,似乎完全忽略了CodecPrivateData的值。 相反,您需要传递SPS和PPS NALS(当然带有附件b标头)作为GetSampleAsync的第一和第二结果。

对于常规媒体样本,正常的4字节附件b标头标头工作正常

CodecPrivateData是MP4文件中'stsd'原子的子级'avcC'原子的内容。 您必须将二进制数据转换为字符串。 它看起来像这样:“ 014D401FFFE10017674D401F925402802DD0800000030080000018478C195001000468EE32C8”

您还必须将mkv / mp4长度替换为NALU。 我已经写了一些有关此内容的信息(以使平滑流能够用于H.264文件)。

问候,

请参阅: 流畅流式H264

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM