媒体基金会 AMR 解码
Posted
技术标签:
【中文标题】媒体基金会 AMR 解码【英文标题】:Media Foundation AMR decode 【发布时间】:2016-11-28 16:46:26 【问题描述】:我有一个扩展名为 .amr 的文件,我想使用 Microsoft Media Foundation 获取它的采样率和通道数。此外,我想解码并获取未压缩的数据。
我可以成功地从 .aac .mp4 和其他文件类型中获取这些,但不能从 .amr 文件(或包含 .amr 轨道的 3.gp 文件)中获取。
所以,对于其他类型,我会这样做:
IMFSourceReader *m_pReader;
IMFMediaType *m_pAudioType;
MFCreateSourceReaderFromURL(filePath, NULL, &m_pReader);
m_pReader->SetStreamSelection(MF_SOURCE_READER_ALL_STREAMS, false);
m_pReader->SetStreamSelection(MF_SOURCE_READER_FIRST_AUDIO_STREAM, true);
m_pReader->GetCurrentMediaType(MF_SOURCE_READER_FIRST_AUDIO_STREAM, &m_pAudioType);
UINT32 numChannels,sampleRate;
m_pAudioType->GetUINT32(MF_MT_AUDIO_NUM_CHANNELS, &numChannels);
m_pAudioType->GetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, &sampleRate);
考虑在这段代码中没有任何错误。
对于 .amr 文件,一些垃圾被写入 numChannels 和 sampleRate。
有没有人有这方面的经验并且知道如何识别和/或获得适当的通道和采样率以进行进一步解码?
顺便说一句,Windows Media Player 可以毫无问题地播放此文件。
提前致谢。
【问题讨论】:
省略必需的错误检查确实是一个很好的处理垃圾的方法。 我没有在这里写错误检查,但我在我的代码中写了。我想让代码简单易懂 MF 确实支持 AMR 和媒体源报告相关参数。我想你应该发布更完整的代码和/或示例 AMR 文件(如果它不能用 this one 等众所周知的东西重现)。 【参考方案1】:所以我发现它支持解码 .amr 文件而不是编码。
就在我们得到这个属性之前:
UINT32 numChannels,sampleRate;
m_pAudioType->GetUINT32(MF_MT_AUDIO_NUM_CHANNELS, &numChannels);
m_pAudioType->GetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, &sampleRate);
我们必须为我们的源阅读器设置一个新的媒体类型
m_pAudioType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio)
m_pAudioType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_Float)
m_pReader->SetCurrentMediaType(MF_SOURCE_READER_FIRST_AUDIO_STREAM, NULL, m_pAudioType);
【讨论】:
以上是关于媒体基金会 AMR 解码的主要内容,如果未能解决你的问题,请参考以下文章
UWP 硬件视频解码 - DirectX12 与 Media Foundation
如何获取 MediaExtensionManager.RegisterAudioDecoder(...) 的 SubType Guid?