2012-02-24 20 views
2

有没有人使用这种工作?我相信我有CodecPrivateData搞砸了,但我找不到任何似乎奏效的WAVEFORMTEX FormatTags。我尝试了0xFF00,0x1016和0x0116。我使用MSDN文档来完成字符串的其余部分。如何使用MediaStreamSource播放原始ATS流?

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

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

有人可以提供给我一个十六进制CodecPrivateData字符串,为他们工作吗?

编辑:

这是我认为PrivateCodecData十六进制字符串的例子应该工作:

0x1016010080BB0000E02E0000010000000E000100FE0000000000000000001190

此字符串从OpenMediaAsync()来CloseMedia()径直甚至没有尝试一个样品。 MSDN文档示例发现了相同的东西here。我希望它至少在结束之前尝试一个样本。

回答

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

+0

我相信你是对的Silverlight不符合标准。花了一个星期试图让它工作。您的解决方法确实奏效,并且与我的实施方法类似,但我试图避免重新格式化流,这是一种痛苦,因为AAC的文档至少可以说是罗嗦。谢谢回复。 – shibbybird 2012-11-30 18:46:00

相关问题