有没有人有这个工作?我相信我对CodecPrivateData搞砸了,但我找不到任何似乎有效的WAVEFORMTEX FormatTags。我试过0xFF00,0x1016和0x0116。我使用MSDN文档来完成其余的字符串。
我在MMReg.h(WAVE_FORMAT_MPEG_ADTS_AAC 0x1600)中找到了这个,它有一个FormatTag(0x0016)。你会认为这是我应该使用的,但这也不起作用。
当使用0xFF时,如果我避免流GetTampleAsync中的adts标题被重复调用但没有播放。我知道流是好的,因为我可以在FooBar,VLC和Window Media Player中播放它。当我将原始AAC粘贴到MP4容器中时,它在silverlight中工作正常,因此我知道Silverlight支持AAC设置。
有人能为我提供适合他们的十六进制CodecPrivateData字符串吗?
修改
这是我认为应该有效的PrivateCodecData十六进制字符串的示例:
0x1016010080BB0000E02E0000010000000E000100FE0000000000000000001190
这个字符串直接从OpenMediaAsync()到CloseMedia(),甚至没有尝试过样本。 MSDN文档示例执行了与here相同的操作。我希望它至少在关闭之前尝试一个样本。
答案 0 :(得分:1)
Silverlight似乎不符合AAC和ADTS包装器...
如果您分析MP4文件(例如使用MediaInfo),您将看到AAC用于音频,但没有ADTS包装器。这就是为什么Silverlight可以在这种情况下读取嵌入在MP4文件中的AAC音频。
因此,您需要在MediaStreamSource中调用ReportSampleCompleted()之前删除每个音频样本的ADTS标头。 ADTS头由7或9个字节组成(不带或带CRC)。有关ADTS标头的更多信息,请see this link。
显然,您需要使用正确的FormatTag调整CodecPrivateData字符串。这是我的AAC LC 48KHz @ 96Kbps文件:FF00020080BB0000E02E0000040010000200