Media Foundation AMR解码

时间:2016-11-28 16:46:26

标签: c++ audio decoding ms-media-foundation

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

有没有人有这方面的经验,知道如何识别和/或获得适当的频道和采样率以进一步解码?

BTW,Windows Media Player播放此文件没有问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

所以我发现它支持解码.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);