Проблемы с воспроизведением аудио в 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 и настройки макета канала, может существенно улучшить качество воспроизведения и предотвратить возникновение проблем, связанных с несовместимостью форматов.