Ошибка декодирования нескольких файлов аудиопотока Media Foundation

У меня есть файл mp4, в котором есть 1 видео и 2 аудиопотока. Я хочу декодировать аудиопоток (после выбора одного из них) с помощью Media Foundation. Вот код, который у меня есть (я взял его из примера MFAudio образцов MediaFoundation SDK).

Проверка ошибок опущена для простоты.

// 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 декодирование файлов из нескольких аудиопотоков?


person mbaros    schedule 27.11.2017    source источник
comment
Какую ошибку возвращает?   -  person Mike Vine    schedule 27.11.2017
comment
0xc00d36b4 : данные, указанные для типа носителя, недействительны, противоречивы или не поддерживаются этим объектом.   -  person mbaros    schedule 27.11.2017
comment
Может случиться так, что вы выбрали звуковую дорожку, которую MF не может декодировать, отсюда и код ошибки (как и ожидалось). В целом, поведение не кажется неправильным, или вам нужно опубликовать дополнительную информацию (образец аудиофайла, какой трек вы выбрали), почему вы считаете это неправильным.   -  person Roman R.    schedule 27.11.2017
comment
Спасибо, Роман. Я обновил сообщение ссылками на примеры файлов и информацией об аудиопотоках. Как видно из поста, я пытаюсь получить первый поток, выбрав MF_SOURCE_READER_FIRST_AUDIO_STREAM.   -  person mbaros    schedule 27.11.2017


Ответы (1)


Microsoft AAC Audio Decoder 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)

Поскольку декодер не может обработать тип мультимедиа, поток не может быть декодирован для Media Foudnation, что приводит к следующему:

  • вы не можете применить декодер так, как вы это делаете через SetCurrentMediaType
  • TopoEdit не может отобразить файл
  • Проигрыватель Windows Media может воспроизводить файл, возвращаясь к DirectShow, при условии наличия соответствующего мультиплексора и декодера.
  • Кино и ТВ проигрыватель воспроизводит только видео и молчит.

Со звуковой нагрузкой, скорее всего, все в порядке, но дескриптор дорожки предположительно неточен в какой-то части, и декодер натыкается на проблему — тем не менее незначительную и не фатальную — и отклоняет файл.

В частности, не похоже, что проблема вызвана несколькими звуковыми дорожками в файле. Проблема связана с дорожками AAC.

person Roman R.    schedule 27.11.2017