Как транскодировать аудио-трек в формат AAC с помощью FFMPEG

Проблемы с воспроизведением аудио в FFMPEG: Решение через изменение настройки формата

В процессе работы с видеофайлами и их транскодированием при помощи FFMPEG может возникнуть множество сложностей, особенно когда дело касается различных аудиоформатов и совместимости с медиаплеерами. В данной статье мы рассмотрим распространенную проблему, связанную с отсутствием звука в AAC-аудиопотоке при воспроизведении в Windows Media Player и других плеерах, и предложим решение этой проблемы.

Исходные данные: Аудио и видео потоки

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

  • Видеопоток: h264, разрешение 1920×1080, 23.98 fps
  • Аудиопотоки:
    • DTS-HD MA (поток #0:1)
    • DTS (поток #0:2)
    • AC3 (поток #0:3)

Попытки воспроизвести этот файл в Windows Media Player и других плеерах, помимо VLC, показали, что первые два аудиопотока не воспроизводятся, а третий замечательно работал.

Текущая стратегия: Дублирование и транскодирование аудиопотока

Для решения проблемы воспроизведения я прибег к транскодированию аудиопотока, используя FFMPEG с командой:

ffmpeg -i Trimmed.mkv -map 0:v -map 0:a -map 0:a:0 -c copy -c:a:3 aac Converted.mkv

Эта команда позволила мне дублировать видеопоток и все аудиопотоки, добавив к ним еще один поток с кодеком AAC. Однако, несмотря на то, что файл воспроизводился в VLC, в Windows Media Player новый AAC поток не издавал звука.

Исследование проблемы: Отсутствие макета канала

После некоторых исследований я заметил, что новый аудиопоток отображается как 6-канальный поток без нужного макета. Это подтверждается следующими данными, полученными с помощью ffprobe:

Stream #0:4(eng): Audio: aac (LC), 48000 Hz, 6 channels, fltp (default)

Я обратил внимание на то, что AAC использует 4-битный флаг для хранения макета канала, и 5.1 (боковой) не входит в стандартный набор предустановленных макетов. Если значение этого флага равно нулю, то макет канала должен быть описан ПСЕ (программном элементом конфигурации).

Решение: Изменение макета канала

Учитывая вышеизложенное, моя гипотеза заключалась в том, что Windows Media Player не обрабатывает PCE правильно. Я решил попробовать конвертировать макет 5.1 (боковой) в обычный 5.1, который поддерживался AAC.

Для этого я применил channelmap фильтр в следующей команде:

ffmpeg -i Trimmed.mkv -map 0:v -map 0:a -map 0:a:0 -c copy -filter:a "channelmap=FL-FL|FR-FR|FC-FC|LFE-LFE|SL-BL|SR-BR:5.1" Converted.mp4

Результат: Решение проблемы воспроизведения

После добавления фильтра channelmap к команде, сгенерированный файл успешно воспроизводился на всех тестируемых устройствах, включая Windows Media Player и iOS.

Заключение

Работа с аудиофайлами может быть сложной задачей, особенно когда дело касается совместимости между различными плеерами. Применение правильных команд в FFMPEG, таких как использование PCE и настройки макета канала, может существенно улучшить качество воспроизведения и предотвратить возникновение проблем, связанных с несовместимостью форматов.

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *