Используйте ffmpeg для добавления текстовых субтитров [закрыто]

122

Я пытаюсь добавить текстовые субтитры в контейнер .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, и нужно ли мне включать его или компилировать отдельно.

0-альфа
источник

Ответы:

196
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в любом порядке.

Стивен Пенни
источник
13
Этот метод добавляет субтитры в файл как один из потоков, поэтому необходима поддержка плеера для отображения субтитров (например, VLC)
BollMose,
1
Означает ли это, что субтитры доступны, но не записаны в видео? Могу показать, если захочу, по запросу?
Вс,
3
Да @ sunk818 вот что это значит. Это добавляет субтитры в качестве дорожки, которую можно включить или отключить, если проигрыватель поддерживает ее. Г-н Хайд и Пол ffmpeg также могут добавлять субтитры поверх самого видео, и в этих случаях вы можете управлять такими вещами, как шрифт и расположение.
Boushley
1
.srt файлы должны быть импортированы с -c:s copyне с -c:s mov_text.
GetFree
82

ПРИМЕЧАНИЕ. Это решение «записывает субтитры» в видео, так что каждый зритель будет вынужден их увидеть.

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

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

ffmpeg -i subtitles.srt subtitles.ass

Затем добавьте их с помощью видеофильтра:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
HdN8
источник
40
Это «прожигает» их в видео, то есть вы не можете отключить их в плеере. Это отличается от добавления их в виде потока субтитров, который может быть прочитан проигрывателем и отображен, если зритель этого захочет.
stib
1
Большое спасибо за это решение. Есть ли способ указать размер символов?
user1319182
1
Взгляните на этот ответ: stackoverflow.com/questions/21363334/… . Вероятно, вы захотите установить шрифт в самом файле субтитров, в противном случае, используя фильтр субтитров, вы можете force_style установить шрифт: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8
Это будет полезно при добавлении субтитров к видео где-нибудь вроде Instagram. Где-то вроде программы просмотра Instagram, где пользователь не может слушать звук или видео, находится на другом языке, тогда пользователь может вместо этого читать субтитры
αϻɾΣɀО-MaMrEzO
1
Установите libassрасширения, если они отсутствуют в системах Debian, с помощью `apt update && apt install libass-dev".
Сопалахо де Арьерес,
53

Вы пытаетесь объединить субтитры в поток субтитров. Это просто, но для 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
dotokija
источник
3
Можно ли добавить более одного субтитра? Будет ли этот софтсаб распознаваться как неизвестный язык?
Патрик
1
Да, это так. Я только что протестировал его для MKV:
dotokija
7
Сначала добавьте еще один ввод: -i input2.srt. Во-вторых, сопоставьте это как 2-й поток: -map 2: 0. Наконец, выберите кодировщик для второго потока субтитров (такого же, как первый): -c: s srt. Полный пример \ ffmpeg -i input.mp4 -f srt -i input.srt -i input2.srt \ -map 0: 0 -map 0: 1 -map 1: 0 -map 2: 0 -c: v copy - c: a copy \ -c: s srt -c: s srt output.mkv
dotokija
8
И чтобы добавить языковые метаданные (вставить перед выходным файлом) «-metadata: s: s: 0 language = eng»
Патрик,
почему субтитры в исходном файле исключаются, когда я "перематываю" файлы mkv в файлы mp4 (ffmpeg -i film.mkv -vcodec copy -acodec copy film.mp4) ?? исходный mkv имеет субтитры, а вывод в формате mp4 - нет. в чем дело? что я делаю неправильно?
oldboy
9

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

ffmpeg -i input.srt input.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

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

хан
источник
1
HV не очень актуален, всегда можно увидеть больше решений, чем одно.
JasonXA
8

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

Мирко Клемм
источник
5

Я попытался использовать 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.

D Coetzee
источник
3

Я дам простой и общий ответ, который работает с любым количеством аудио и субтитров 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" с максимальным количеством информации.

cdlvcdlv
источник
-1

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

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

Замените только переменные linux

Даниэль Джанни
источник
Хотите уточнить?
RamenChef
-3

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

mkvmerge -o output.mkv video.mp4 subtitle.srt
Корли Киннэйн
источник
3
Не хотите ли прокомментировать, почему ваш подход решит проблему OP?
mjuarez