媒体基金会 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 解码的主要内容,如果未能解决你的问题,请参考以下文章

家庭多媒体影院Kodi

UWP 硬件视频解码 - DirectX12 与 Media Foundation

如何获取 MediaExtensionManager.RegisterAudioDecoder(...) 的 SubType Guid?

媒体基金会:第 6 次循环视频不稳定

媒体基金会截图挂钩

使用媒体基金会时如何读取-“unsigned char const *”?