Используйте ffmpeg для добавления текстовых субтитров - PullRequest
94 голосов
/ 30 декабря 2011

Я пытаюсь добавить текстовые субтитры в контейнер .mp4, используя ffmpeg:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mp4

Когда я пытаюсь запустить эту строку, выдает ошибку:

Количество потоковых карт должно соответствовать количеству выходных потоков.

Если я попытаюсь изменить mp4 на mkv (хотя mp4 поддерживает текстовые субтитры), вот так:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mkv

Он правильно отображает потоки, но выдает ошибку:

Кодер (кодек с идентификатором 94210) не найден для выходного потока # 0.2

Когда я запускаю

ffmpeg -codecs

Я вижу, что кодек srt поддерживается как декодер и кодер, однако я не уверен, что используется для кодирования подтипов mp4 и mkv, и нужно ли мне его включать или компилировать отдельно.

Ответы [ 9 ]

140 голосов
/ 11 июля 2013
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4

-vf subtitles=infile.srt не будет работать с -c copy


Порядок -c copy -c:s mov_text важен. Вы говорите FFmpeg:

  1. Видео: копировать, Аудио: копировать, Субтитры: копировать
  2. Подзаголовок: mov_text

Если вы измените их, вы скажете FFmpeg:

  1. Подзаголовок: mov_text
  2. Видео: копировать, Аудио: копировать, Субтитры: копировать

В качестве альтернативы вы можете просто использовать -c:v copy -c:a copy -c:s mov_text в любом заказ.

51 голосов
/ 29 октября 2012

Используйте библиотеку libass (убедитесь, что в вашей установке ffmpeg есть библиотека в конфигурации --enable-libass).

Сначала преобразуйте субтитры в .ass формат:

ffmpeg -i subtitles.srt subtitles.ass

Затем добавьте их, используя видеофильтр:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
47 голосов
/ 22 октября 2015

Вы пытаетесь мультиплексировать субтитры в виде потока субтитров.Это просто, но другой синтаксис используется для MP4 (или M4V) и MKV.В обоих случаях вы должны указать видео и аудио кодек или просто скопировать поток, если вы просто хотите добавить субтитры.

MP4:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s mov_text output.mp4

MKV:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s srt  output.mkv
7 голосов
/ 19 июня 2014

Контейнер MKV поддерживает видео и аудио кодеки Практически все, а также поддерживает субтитры и меню DVD. Таким образом, вы можете просто скопировать кодеки из входного видео в выходное видео с контейнером MKV с субтитрами. Сначала вы должны конвертировать SRT в формат субтитров ASS

ffmpeg -i input.srt input.ass

и вставлять субтитры ASS в видео

ffmpeg -i input.mp4 -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

Также работает с файлом VMW.

ffmpeg -i input.wmv -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

см. Вики-страницу Сравнение форматов контейнеров

6 голосов
/ 26 ноября 2013

ffmpeg поддерживает кодировщик субтитров mov_text, который является единственным из поддерживаемых в контейнере MP4 и может воспроизводиться iTunes, Quicktime, iOS и т. Д.

Ваша строка будет выглядеть так:

ffmpeg -i input.mp4 -i input.srt -map 0:0 -map 0:1 -map 1:0 -c:s mov_text output.mp4

4 голосов
/ 04 декабря 2012

Я пытался использовать MP4Box для этой задачи, но он не мог справиться с M4V, с которым я имел дело.Мне удалось внедрить SRT в виде мягких субтитров с помощью ffmpeg со следующей командной строкой:

ffmpeg -i input.m4v -i input.srt -vcodec copy -acodec copy -scodec copy -map 0:0 -map 0:1 -map 1:0 -y output.mkv

Как и вам, мне пришлось использовать выходной файл MKV - я не смог создатьфайл M4V.

2 голосов
/ 04 мая 2018

Я предоставлю простой и общий ответ, который работает с любым количеством аудио, и srt субтитры и учитывают метаданные, которые могут включать контейнер mkv . Таким образом, он даже добавит изображения, которые matroska может включать в качестве вложений (но не других типов AFAIK), и преобразует их в дорожки; Вы не сможете смотреть, но они будут там (вы можете демультиплексировать их). Ах, а если у mkv есть главы, то и mp4 тоже.

ffmpeg -i <mkv-input> -c copy -map 0 -c:s mov_text <mp4-output>

Как видите, все дело в -map 0, который говорит FFmpeg добавить все дорожки, включая метаданные, главы, вложения и т. Д. Если существует нераспознанная "дорожка" ( mkv позволяет прикрепить файл любого типа ), это закончится с ошибкой.

Вы можете создать простой пакет mkv2mp4.bat, если вы обычно делаете это, чтобы создать mp4 с тем же именем, что и mkv . Было бы лучше с контролем ошибок, другим именем выхода и т. Д., Но вы поняли.

@ffmpeg -i %1 -c copy -map 0 -c:s mov_text "%~n1.mp4"

Теперь вы можете просто запустить

mkv2mp4 "Video with subtitles etc.mkv"

И он создаст «Видео с субтитрами и т. Д .mp4» с максимальным количеством информации.

0 голосов
/ 18 ноября 2016

Простой пример:

videoSource=test.mp4
videoEncoded=test2.mp4
videoSubtitle=test.srt
videoFontSize=24
ffmpeg -i "$videoSource" -vf subtitles="$videoSubtitle":force_style='Fontsize="$videoFontSize"' "$videoEncoded"

Только заменить переменные Linux

0 голосов
/ 20 апреля 2015

Вот почему mkv такой хороший контейнер, особенно теперь, когда он зрелый:

mkvmerge -o output.mkv video.mp4 subtitle.srt
...