Чтение потока второй звуковой дорожки из файла mp4 с помощью SharpDx или IMSourceReader

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

Файл mp4 закодирован количеством дорожек в формате AAC. Мне нужно декодировать, чтобы получить все доступные треки из файла. В настоящее время я использую SharpDX и IMSourceReader (dll Media Foundation) для чтения потоков. Но по умолчанию SourceReader возвращает только первый аудиопоток из файла. Правильно ли я делаю? Или мне нужно использовать любые другие сторонние библиотеки для достижения этой цели?


person David Bekham    schedule 22.05.2015    source источник
comment
К вашему сведению, я попытался открыть MP4 с несколькими звуковыми дорожками с помощью приложения SDK topoedit, и я вижу, что Media Foundation определенно способен читать несколько звуковых дорожек.   -  person Roman R.    schedule 22.05.2015
comment
Если да. Можете ли вы поделиться кодом, который будет использоваться для чтения количества звуковых дорожек.   -  person David Bekham    schedule 22.05.2015
comment
У меня нет кода — Topoedit показывает, что это возможно, поэтому вы можете посмотреть в SharpDX, почему он не подхватывается (SharpDX просто выбирает первую звуковую дорожку и пропускает остальные?).   -  person Roman R.    schedule 22.05.2015


Ответы (1)


При настройке читателя, вы можете выбрать, какие потоки будут доставляться при чтении сэмплов. Часто вы не хотите выбирать поток. Примером может служить фильм с дополнительными звуковыми потоками (испанский, французский или, возможно, комментарий режиссера). В результате в большинстве случаев выбор временного потока выполняется следующим образом:

// error checking omitted for brevity
hr = reader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, nullptr, audioMediaType);
hr = reader->SetStreamSelection((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, true);

Однако, если вы посмотрите на SetStreamSelection первый параметр принимает либо использованное выше перечисление, либо конкретный индекс потока.

// 0–0xFFFFFFFB  <-- The zero-based index of a stream.
//   0xFFFFFFFC  <-- MF_SOURCE_READER_FIRST_VIDEO_STREAM
//   0xFFFFFFFD  <-- MF_SOURCE_READER_FIRST_AUDIO_STREAM
//   0xFFFFFFFE  <-- MF_SOURCE_READER_ALL_STREAMS
//   0xFFFFFFFE  <-- MF_SOURCE_READER_ANY_STREAM
//   0xFFFFFFFF  <-- MF_SOURCE_READER_INVALID_STREAM_INDEX

Я никогда не использовал SharpDX, но это перечисление задокументировано здесь. Что касается видео, иногда доступны дополнительные видеопотоки (обычно скрытые субтитры).

При чтении примеров используйте обратный вызов или синхронно обратите особое внимание на индекс потока и соответствующим образом обработайте образец.

Вы также можете найти эти ответы ценными или интересными:
Совокупный медиа-источник
MP4 IMFSinkWriter
Добавление образца аудио к видео
Создание закодированного видео NV12
Конфигурация IMFSinkWriter
IMFSinkWriter Использование ЦП

Надеюсь, это поможет.

person Jeff    schedule 24.05.2015