Media Foundation 多音频流文件解码错误

Posted

技术标签:

【中文标题】Media Foundation 多音频流文件解码错误【英文标题】:Media Foundation multiple audio stream file decode error 【发布时间】:2017-11-27 15:08:28 【问题描述】:

我有一个 mp4 文件,其中包含 1 个视频和 2 个音频流。我想使用 Media Foundation 解码音频流(在选择其中之一之后)。这是我的代码(我取自 MediaFoundation SDK 示例的 MFAudio 示例)。

为简单起见,省略了错误检查。

// Set up the source reader for the file.
MFCreateSourceResolver(&pSourceResolver);

pSourceResolver->CreateObjectFromURL(
    L"C:\\Users\\vahagng\\Desktop\\a.mp4",      // URL of the source.
    MF_RESOLUTION_MEDIASOURCE,  // Create a source object.
    NULL,                       // Optional property store.
    &ObjectType,                // Receives the created object type. 
    &uSource                    // Receives a pointer to the media source.
    );

uSource->QueryInterface(IID_PPV_ARGS(&mediaFileSource));

MFCreateSourceReaderFromMediaSource(mediaFileSource, NULL, &pSourceReader);

// Deselect all streams, we only want the first
pSourceReader->SetStreamSelection(MF_SOURCE_READER_ALL_STREAMS, false);
pSourceReader->SetStreamSelection(MF_SOURCE_READER_FIRST_AUDIO_STREAM, true);

MFCreateMediaType(&pAudioOutType);
pAudioOutType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
CHECK_HR(pAudioOutType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_Float);

pSourceReader->SetCurrentMediaType(MF_SOURCE_READER_FIRST_AUDIO_STREAM, NULL, pAudioOutType);

上面的代码在最后一行 (pSourceReader->SetCurrentMediaType()) 失败,对于具有 2 个音频流但适用于 1 个音频流文件的媒体文件,错误代码为 0xc00d36b4 : The data specified for the media type is invalid, inconsistent, or not supported by this object.

我正在测试的文件有 2 个 AAC 音频流,MediaFoundation 绝对支持。

MediaFoundation 是否支持解码多个音频流的文件?

【问题讨论】:

返回什么错误? 0xc00d36b4 : 为媒体类型指定的数据无效、不一致或不受此对象支持。 您可能会选择 MF 无法解码的音轨,因此出现错误代码(如预期的那样)。总而言之,该行为似乎没有错,或者您需要发布更多详细信息(示例音频文件,您选择的曲目)为什么您认为它不正确。 谢谢,罗曼。我已经用示例文件链接和音频流信息更新了帖子。正如您从帖子中看到的那样,我正在尝试通过选择 MF_SOURCE_READER_FIRST_AUDIO_STREAM 来检索第一个流 【参考方案1】:

Microsoft AAC 音频解码器 MFT 似乎不支持这种类型的 AAC 音轨/编码。

MF_MT_MAJOR_TYPE, vValue 73647561-0000-0010-8000-00AA00389B71 (Type VT_CLSID, MFMediaType_Audio, FourCC auds)
MF_MT_SUBTYPE, vValue 00001610-0000-0010-8000-00AA00389B71 (Type VT_CLSID, MFAudioFormat_AAC, FourCC 0x00001610)
MF_MT_AM_FORMAT_TYPE, vValue 05589F81-C356-11CE-BF01-00AA0055595A (Type VT_CLSID, FORMAT_WaveFormatEx)
MF_MT_ALL_SAMPLES_INDEPENDENT, vValue 1 (Type VT_UI4)
MF_MT_FIXED_SIZE_SAMPLES, vValue 1 (Type VT_UI4)
MF_MT_SAMPLE_SIZE, vValue 1 (Type VT_UI4)
MF_MT_AVG_BITRATE, vValue 111360 (Type VT_UI4)
MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION, vValue 254 (Type VT_UI4)
MF_MT_AAC_PAYLOAD_TYPE, vValue 0 (Type VT_UI4)
MF_MT_AUDIO_AVG_BYTES_PER_SECOND, vValue 13920 (Type VT_UI4)
MF_MT_AUDIO_BITS_PER_SAMPLE, vValue 16 (Type VT_UI4)
MF_MT_AUDIO_BLOCK_ALIGNMENT, vValue 1 (Type VT_UI4)
MF_MT_AUDIO_NUM_CHANNELS, vValue 2 (Type VT_UI4)
MF_MT_AUDIO_PREFER_WAVEFORMATEX, vValue 1 (Type VT_UI4)
MF_MT_AUDIO_SAMPLES_PER_SECOND, vValue 48000 (Type VT_UI4)
MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY, vValue 0 (Type VT_UI4)
MF_MT_MPEG4_SAMPLE_DESCRIPTION, vValue 00 00 00 5B 73 74 73 64 00 00 00 00 00 00 00 01 00 00 00 4B 6D 70 34 61 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 02 00 10 00 00 00 00 BB 80 00 00 00 00 00 27 65 73 64 73 00 00 00 00 03 19 00 00 00 04 11 67 15 00 01 82 00 01 DF 60 00 01 B3 00 05 02 09 90 06 01 02 (Type VT_VECTOR | VT_UI1)
MF_MT_USER_DATA, vValue 00 00 FE 00 00 00 00 00 00 00 00 00 09 90 (Type VT_VECTOR | VT_UI1)

由于解码器无法处理媒体类型,因此无法为媒体基础解码流,导致:

您无法像通过SetCurrentMediaType 那样应用解码器 TopoEdit 无法渲染文件 Windows Media Player 可以播放回退到 DirectShow 的文件,前提是相应的多路复用器、解码器可用 电影和电视播放器仅播放视频并保持静音。

音频有效负载很可能没问题,但轨道描述符可能在某些部分不准确,解码器偶然发现了这个问题 - 尽管问题很小而且不是致命的 - 并拒绝了文件。

具体来说,看起来问题不是由文件中的多个音轨引起的。该问题与 AAC 曲目有关。

【讨论】:

以上是关于Media Foundation 多音频流文件解码错误的主要内容,如果未能解决你的问题,请参考以下文章

Media Foundation 将音频流添加到视频文件

Windows Media Foundation:获取 AAC 解码数据

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

在 Windows Media Foundation 中使用 Sink Writer 添加到视频的音频示例

Windows Media Foundation 枚举音频设备

对 Windows Media Foundation AAC 编码器的多通道支持