如何使用MediaStreamSource播放原始广告AAC流

本文关键字:AAC 原始 何使用 MediaStreamSource 播放 | 更新日期: 2023-09-27 18:25:38

有人能用这个吗?我相信我把CodecPrivateData搞砸了,但我找不到任何似乎有效的WAVEFORMTEX格式标签。我尝试了0xFF00、0x1016和0x0116。我使用MSDN文档完成了字符串的其余部分。

我在MMReg.h(WAVE_FORMAT_MPEG_ADTS_AAC 0x1600)中发现了这个,它将具有FormatTag(0x0016)。你可能会认为这是我应该使用的,但这也不起作用。

当使用0xFF时,如果我避免流中的adts标头,GetSampleAsync会被重复调用,但没有播放。我知道这个流很好,因为我可以在FooBar、VLC和Window Media Player中播放它。当我把原始AAC粘贴到MP4容器中时,它在silverlight中运行良好,所以我知道AAC设置受silverlight支持。

有人能为我提供一个对他们有用的十六进制CodecPrivateData字符串吗?

编辑:

这是PrivateDecData十六进制字符串的一个例子,我认为它应该起作用:

0x1016010080BB0000E02E0000010000000E000100FE0000000000000000001190

这个字符串直接从OpenMediaAsync()转到CloseMedia(),甚至不需要尝试一个示例。MSDN文档示例执行与此处相同的操作。我希望它至少能在收盘前试一下样品。

如何使用MediaStreamSource播放原始广告AAC流

Silverlight似乎不符合AAC和ADTS包装

如果你分析你的MP4文件(例如MediaInfo),你会看到AAC音频,但没有ADTS包装。这就是为什么Silverlight在这种情况下可以读取嵌入MP4文件中的AAC音频。

因此,在调用MediaStreamSource中的ReportSampleCompleted()之前,需要删除每个音频样本的ADTS标头。ADTS报头由7或9个字节组成(不带CRC或带CRC)。有关ADTS标头的更多信息,请参阅此链接。

显然,您需要使用正确的FormatTag来调整CodecPrivateData字符串。这是我的AAC LC 48KHz@96Kbps文件:FF00020080BB000E02E0000040010000200