媒体基础 AMR 解码

Media Foundation AMR decode

我有一个扩展名为 .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 中写入了一些垃圾。

有没有人有这方面的经验并且知道如何识别and/or获得正确的通道和采样率以进一步解码?

顺便说一句,Windows Media Player 播放此文件没有问题。

提前致谢。

所以我发现它支持解码 .amr 文件而不支持编码。

就在我们获得此属性之前:

UINT32 numChannels,sampleRate;
m_pAudioType->GetUINT32(MF_MT_AUDIO_NUM_CHANNELS, &numChannels);
m_pAudioType->GetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, &sampleRate);

我们必须为我们的源设置一个新的媒体类型Reader

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);