Вопрос или проблема
Обычно я использую такую команду:
ffmpeg -i video.mkv -i audio.mka -i subs.ass -c copy -map 0 -map 1:a -map 2:s out.mkv
Чтобы добавить дополнительный аудиотрек и субтитры к видео, сохраняя потоки оригинального видео. Однако на этот раз я столкнулся с странной ситуацией: при попытке переключить аудиотрек на дополнительный, видео либо останавливается, либо воспроизводится без звука (в зависимости от плеера), но все в порядке с оригинальным аудио и так далее, на всех устройствах (ноутбук, телевизор, смартфон). Но я выяснил, что если я использую команду:
ffmpeg -i video.mkv -i audio.mka -i subs.ass -c copy -map 0:v -map 0:a -map 1:a -map 2:s out.mkv
то все работает, как ожидалось, однако, если я добавляю аргумент -map 0:s
или -map 0:t
, то я снова сталкиваюсь с этой проблемой. После запуска ffprobe я обнаружил, что в видео было два потока с шрифтами и один с субтитрами (а также видеопоток и аудиопоток).
Но почему поток шрифтов/субтитров, скопированный из оригинального видео, вызывает эту проблему?
Я также использовал графический интерфейс mkvtoolnix для этих целей, и там все было в порядке, но я хочу разобраться, что не так с моим скриптом на ffmpeg? И как заставить его работать правильно?
Вот некоторая информация из ffprobe и mkvtoolnix
ffprobe:
результирующее видео с проблемой
результирующее видео без субтитров и вложений (может воспроизводиться корректно)
результирующее видео из графического интерфейса mkvtoolnix
Те же файлы, но информация из инструмента информации mkvtoolnix (там кажется немного больше информации)
результирующее видео с проблемой
результирующее видео без субтитров и вложений
результирующее видео из графического интерфейса mkvtoolnix
Спасибо!
Ответ или решение
Ваша проблема с воспроизведением видео после добавления дополнительной аудиодорожки и субтитров с помощью FFmpeg может быть связана с особенностями обработки потоков при использовании флага -map
и с тем, как MKV контейнер действительно управляет потоками данных, особенно когда речь идет о субтитрах (например, к данным с шрифтами). Давайте разберем ваш вопрос более детально.
Причина проблемы
-
Структура потоков: При добавлении дополнительных аудиодорожек и субтитров при использовании
-map
без явного указания на потоки, вы можете столкнуться с конфликтами между потоками оригинального видео и добавленными потоками. Когда вы визуализируете видео с несколькими шрифтами и субтитрами, некоторые плееры могут не справляться с конфликтами в потоках. -
Шрифты и субтитры: Как вы заметили, в вашем исходном видео есть два потока с шрифтами. Если вы добавляете еще одну дорожку субтитров, это может вызвать проблемы в некоторых плеерах, которые не поддерживают множественные шрифты или не обрабатывают их должным образом.
Решения
Следующее решение основывается на наученных вами командах. Можно попробовать более явное указание потоков:
-
Выборочность потоков: Вместо
-map 0 -map 1:a -map 2:s
, попробуйте более четко указать, что именно вы хотите сохранить:ffmpeg -i video.mkv -i audio.mka -i subs.ass -map 0:v -map 0:a -map 1:a -map 2:s -c copy out.mkv
-
Отключение потока шрифтов: Если проблема все еще существует, возможно, имеет смысл попробовать исключить потоки с шрифтами:
ffmpeg -i video.mkv -i audio.mka -i subs.ass -map 0:v -map 0:a -map 1:a -map 2:s -map -0:t out.mkv
Здесь флаг
-map -0:t
исключает потоки с шрифтами из исходного видео. -
Проверка плеера: Убедитесь, что выбранный вами плеер поддерживает все потоки. Попробуйте протестировать полученный файл в нескольких плеерах, например VLC, MPV и других.
-
Использование другой версии FFmpeg: Иногда версии FFmpeg могут содержать изменения, влияющие на обработку файлов. Убедитесь, что вы используете последнюю стабильную версию.
Заключение
Проблема с воспроизведением может быть вызвана конфликтующими потоками шрифтов и субтитров. Тщательное указание нужных потоков через -map
, а также exclusion потоков с шрифтами должно помочь устранить данную проблему. Если указанное решение не помогает, возможно, придется анализировать два файла (оригинальный и полученный) с использованием ffprobe
, чтобы детально изучить структуру потоков и адаптировать команду FFmpeg под ваши нужды.