2

我正在尝试使用 MediaStreamSource 渲染来自 silverlight 3 中的 mkv h264 文件的帧。解析 mkv 文件很好,但我正在努力处理 SL 中 CodecPrivateData 的预期值,它必须是一个字符串,而来自 mkv 的 PrivateData 信息是一个二进制元素。另外,我不确定帧应该以哪种形式提供给 SL(即,它们存储在 mkv / mp4 中的方式,或转码为 NALU) 有人知道这方面的信息吗?

4

3 回答 3

4

在我自己的类似问题和令人头疼的问题之后,我能够回答这个问题。

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

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

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

  • 在 ReportGetSampleCompleted() 中,将“Offset”的值设置为 NAL 起始代码的开头,而不是实际数据。(在大多数情况下,这将是零,假设您使用每个 NAL 单元的新流)

我在博客上写了一些关于这里的经历,并希望写更多的博客。

于 2011-05-01T13:01:37.883 回答
0

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

您还必须将 mkv/mp4 长度替换为 NALU。我已经写了一些关于这个(让平滑流处理 H.264 文件)。

问候,

请参阅:平滑流式传输 H264

于 2009-05-29T14:11:54.110 回答
0

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

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

于 2012-07-24T10:13:20.897 回答