Використовуйте 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 subs, і чи потрібно мені вмикати або компілювати окремо.

Відповіді:


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

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

40
Це дозволить "записати їх" у відео, тобто не можна вимкнути їх у програвачі. Це відрізняється від додавання їх у потік субтитрів, який програвач може прочитати та відобразити, якщо глядач цього хоче.
стиб

1
Дуже дякую за це рішення. Чи все-таки потрібно вказати розмір символів?
користувач1319182

1
Подивіться на цю відповідь: stackoverflow.com/questions/21363334/… . Ви, ймовірно, захочете встановити шрифт у самому файлі субтитрів, інакше, використовуючи фільтр субтитрів, ви можете примусити_style встановити шрифт: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8

Це стане в нагоді при додаванні підзаголовків для відео десь як Instagram. Десь на зразок глядача Instagram, що користувач не має можливості слухати звук чи відео іншою мовою, тоді користувач може прочитати замість цього підзаголовки
ϻαϻɾΣɀО-MaMrEzO

1
Встановіть libassрозширення, якщо їх немає в системах Debian з `apt update && apt install libass-dev".
Sopalajo de Arrierez

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

3
Чи можна додати більше одного підзаголовка? Чи буде ця солянка визнана мовою невідомою?
Патрік

1
Так. Я щойно тестував його на MKV:
dotokija

7
Спочатку додайте ще один вхід: -i input2.srt. По-друге, картографуйте як другий потік: -карта 2: 0. Нарешті, виберіть кодер для другого потоку субтитрів (такий самий, як перший): -c: s srt. Повний приклад \ ffmpeg -i input.mp4 -f srt -i input.srt -i input2.srt \ -mata 0: 0 -карта 0: 1 -карта 1: 0 -карта 2: 0 -c: v копія - c: копія \ -c: s srt -c: s srt output.mkv
dotokija

8
І додати мовні метадані (вставити перед вихідним файлом) "-metadata: s: s: 0 language = eng"
Патрік

як виключаються субтитри в оригінальному файлі, коли я "перегортаю" файли mkv як файли mp4 (ffmpeg -i film.mkv -vcodec копія -acodec копія фільму.mp4) ?? оригінальний mkv має субтитри, але вихід у форматі mp4 не відповідає. що відбувається? що я не роблю правильно?
oldboy

9

Контейнер 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

див. сторінку вікі Порівняння форматів контейнерів


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.


3

Я надам просту і загальну відповідь, яка працює з будь-якою кількістю аудіо та srt субтитрів і поважає метадані, які можуть включати контейнер mkv . Таким чином, він навіть додаватиме зображення, які матроска може містити як додатки (хоча це не інші типи 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"

І це створить "Відео з субтитрами etc.mp4" з максимумом включеної інформації.


-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
Хочете прокоментувати, чому ваш підхід вирішить проблему ОП?
mjuarez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.