媒体基础多音频流文件解码错误

Media Foundation multiple audio stream file decode error

我得到了一个 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()) 失败,错误代码为 0xc00d36b4 : The data specified for the media type is invalid, inconsistent, or not supported by this object. 对于具有 2 个音频流但对 1 个音频流文件工作正常的媒体文件。

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

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

Microsoft AAC 音频解码器 MFT 似乎不支持这种 AAC 风格 track/encoding。

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音轨有关。