C# 如何使用MediaStreamSource播放原始adts AAC流?

C# 如何使用MediaStreamSource播放原始adts AAC流?,c#,silverlight,aac,mediastreamsource,C#,Silverlight,Aac,Mediastreamsource,有人用这个吗?我相信我的CodecPrivateData搞乱了,但我找不到任何似乎有效的WAVEFORMTEX格式标签。我尝试了0xFF00、0x1016和0x0116。我使用MSDN文档完成了字符串的其余部分 我在MMReg.h(WAVE_FORMAT_MPEG_ADTS_AAC 0x1600)中发现了这一点,它将有一个FormatTag(0x0016)。你会认为这是我应该使用的,但这也不起作用 使用0xFF时,如果避免流GetSamPleaseSync中的adts头,则会重复调用,但不会播放

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

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

使用0xFF时,如果避免流GetSamPleaseSync中的adts头,则会重复调用,但不会播放。我知道流很好,因为我可以在FooBar、VLC和WindowMedia Player中播放它。当我将原始AAC粘贴到MP4容器中时,它在silverlight中工作良好,因此我知道silverlight支持AAC设置

有人能提供给我一个十六进制编码私有数据字符串,为他们工作吗

编辑:

这是PrivateCodecData十六进制字符串的一个示例,我认为它应该可以工作:

0x1016010080BB0000E02E0000010000000E000100FE0000000000000000001190


此字符串直接从OpenMediaAsync()转到CloseMedia(),甚至不需要尝试示例。MSDN文档示例也做了同样的事情。我希望它在关闭之前至少尝试一个样本。

Silverlight似乎不符合AAC和ADTS包装

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

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

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


我相信你是对的,Silverlight不符合要求。不过花了一周的时间试着让它发挥作用。您的变通方法确实有效,并且是我实现的,但我试图避免重新格式化流,这是一种痛苦,因为AAC的文档至少可以说是冗长的。谢谢你的回复。