Użyj ffmpeg, aby dodać napisy tekstowe [zamknięte]

122

Próbuję dodać napisy tekstowe do kontenera .mp4 za pomocą ffmpeg:

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

Kiedy próbuję uruchomić tę linię, wyświetla mi się błąd:

Liczba map strumieni musi odpowiadać liczbie strumieni wyjściowych.

Jeśli spróbuję zmienić mp4 na mkv (chociaż mp4 obsługuje napisy tekstowe), tak:

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

Prawidłowo odwzorowuje strumienie, ale wyświetla błąd:

Nie znaleziono kodera (identyfikator kodeka 94210) dla strumienia wyjściowego # 0.2

Kiedy uruchamiam

ffmpeg -codecs

Widzę, że kodek srt jest obsługiwany jako dekoder i koder, jednak nie jestem pewien, co jest używane do kodowania mp4 i mkv subs i czy muszę go włączyć, czy skompilować osobno.

0-alfa
źródło

Odpowiedzi:

196
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4

-vf subtitles=infile.srt nie będzie działać -c copy


Kolejność -c copy -c:s mov_textjest ważna. Mówisz FFmpeg:

  1. Wideo: kopiowanie, Audio: kopiowanie, Napisy: kopiowanie
  2. Podtytuł: mov_text

Jeśli je odwrócisz, mówisz FFmpeg:

  1. Podtytuł: mov_text
  2. Wideo: kopiowanie, Audio: kopiowanie, Napisy: kopiowanie

Alternatywnie możesz po prostu użyć -c:v copy -c:a copy -c:s mov_textw dowolnej kolejności.

Steven Penny
źródło
13
Ta metoda dodaje napisy do pliku jako jeden ze strumieni, więc potrzebna jest obsługa odtwarzacza, aby wyświetlić napisy (takie jak VLC)
BollMose
1
Czy to oznacza, że ​​napisy są dostępne, ale nie zostały wypalone w filmie? Mogę pokazać, czy chcę na żądanie?
Niedziela,
3
Tak @ sunk818, to właśnie oznacza. Spowoduje to dodanie napisów jako ścieżki, którą można włączyć lub wyłączyć, o ile odtwarzacz ją obsługuje. Pan Hyde i Paul ffmpeg mogą również dodawać napisy na samej górze wideo, aw takich przypadkach można kontrolować takie elementy, jak czcionka i pozycjonowanie.
Boushley,
1
Pliki .srt muszą być importowane z -c:s copynie z -c:s mov_text.
GetFree
82

UWAGA: To rozwiązanie „wypala napisy” w wideo, dzięki czemu każdy widz filmu będzie zmuszony je zobaczyć.

Użyj libassbiblioteki (upewnij się, że twoja instalacja ffmpeg ma bibliotekę w konfiguracji --enable-libass).

Najpierw przekonwertuj napisy do .assformatu:

ffmpeg -i subtitles.srt subtitles.ass

Następnie dodaj je za pomocą filtra wideo:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
HdN8
źródło
40
Spowoduje to „wypalenie” ich w wideo, co oznacza, że ​​nie można ich wyłączyć w odtwarzaczu. Różni się to od dodawania ich jako strumienia napisów, który może być odczytany przez gracza i wyświetlony, jeśli widz tego chce.
święto
1
Bardzo dziękuję za to rozwiązanie. Czy w ogóle można określić rozmiar znaków?
user1319182
1
Spójrz na tę odpowiedź: stackoverflow.com/questions/21363334/… . Prawdopodobnie będziesz chciał ustawić czcionkę w samym pliku napisów, w przeciwnym razie używając filtru napisów, możesz wymusić_style, aby ustawić Font: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8 Kwietnia
Będzie to przydatne podczas dodawania napisów do filmów, takich jak Instagram. Gdzieś jak przeglądarka na Instagramie, której użytkownik nie ma możliwości słuchania dźwięku lub wideo, jest w innym języku, zamiast tego użytkownik może przeczytać napisy
ϻαϻɾΣɀО-MaMrEzO
1
Zainstaluj libassrozszerzenia, jeśli ich brakuje w systemach Debian za pomocą `apt update && apt install libass-dev".
Sopalajo de Arrierez
53

Próbujesz multipleksować napisy jako strumień napisów. Jest to łatwe, ale dla MP4 (lub M4V) i MKV używana jest inna składnia. W obu przypadkach musisz określić kodek wideo i audio lub po prostu skopiować strumień, jeśli chcesz tylko dodać napisy.

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
źródło
3
Czy można dodać więcej niż jeden napis? Czy ten softsub zostanie rozpoznany jako nieznany język?
Patrick
1
Tak to jest. Właśnie przetestowałem to pod kątem MKV:
dotokija
7
Najpierw dodaj kolejne dane wejściowe: -i input2.srt. Po drugie, zmapuj to jako drugi strumień: -mapa 2: 0. Na koniec wybierz koder dla drugiego strumienia napisów (taki sam jak pierwszy): -c: srt. Pełny przykład \ 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
Oraz dodać metadane języka (wstaw przed plikiem wyjściowym) "-metadata: s: s: 0 language = eng"
Patrick
dlaczego napisy w oryginalnym pliku są wykluczane, gdy „przewijam” pliki mkv jako pliki mp4 (ffmpeg -i film.mkv -vcodec copy -acodec kopiuj film.mp4) ?? oryginalny mkv ma napisy, ale wyjście w formacie mp4 nie. co się dzieje? czego nie robię poprawnie?
oldboy,
9

Kontener MKV obsługuje kodeki wideo i audio Praktycznie wszystko, a także obsługuje napisy i menu DVD. Możesz więc po prostu skopiować kodeki z wejściowego wideo do wyjściowego wideo za pomocą kontenera MKV z napisami. Najpierw należy przekonwertować SRT do formatu napisów ASS

ffmpeg -i input.srt input.ass

i osadzaj napisy ASS w wideo

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

Pracował również z plikiem 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

zobacz stronę wiki Porównanie formatów kontenerów

chan
źródło
1
HV nie ma znaczenia, zawsze warto zobaczyć więcej rozwiązań niż jedno.
JasonXA
8

ffmpeg obsługuje mov_textkoder napisów, który jest prawie jedynym obsługiwanym w kontenerze MP4 i odtwarzanym przez iTunes, Quicktime, iOS itp.

Twoja linia brzmiałaby:

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

Mirko Klemm
źródło
5

Próbowałem użyć MP4Box do tego zadania, ale nie poradził sobie z M4V, z którym miałem do czynienia. Udało mi się osadzić SRT jako miękkie napisy z ffmpeg za pomocą następującego wiersza poleceń:

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

Tak jak ty musiałem użyć pliku wyjściowego MKV - nie byłem w stanie utworzyć pliku M4V.

D Coetzee
źródło
3

Podam prostą i ogólną odpowiedź, która działa z dowolną liczbą plików audio i napisów srt oraz szanuje metadane, które mogą zawierać kontener mkv . Więc nawet doda obrazy, które matroska może dołączyć jako załączniki (choć nie innego typu AFAIK) i przekonwertuje je na ścieżki; nie będziesz mógł oglądać, ale będą tam (możesz je zdemultować). Ach, a jeśli mkv ma rozdziały, to też mp4 .

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

Jak widać, chodzi o to -map 0, że mówi FFmpeg, aby dodał wszystkie ścieżki, w tym metadane, rozdziały, załączniki itp. Jeśli istnieje nierozpoznana "ścieżka" ( mkv pozwala na dołączenie dowolnego typu pliku), kończą się błędem.

Możesz utworzyć prostą wiązkę mkv2mp4.bat, jeśli zwykle to robisz, aby utworzyć mp4 o tej samej nazwie co mkv . Byłoby lepiej z kontrolą błędów, inną nazwą wyjścia itp., Ale o co chodzi.

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

Teraz możesz po prostu biegać

mkv2mp4 "Video with subtitles etc.mkv"

I utworzy „Wideo z napisami itp. Mp4” z maksymalną zawartością informacji.

cdlvcdlv
źródło
-1

Prosty przykład:

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

Zastąp tylko zmienne linux

Daniel Gianni
źródło
Możesz rozwinąć temat?
RamenChef
-3

To jest powód, dla którego mkv jest tak dobrym kontenerem, zwłaszcza teraz, gdy jest dojrzały:

mkvmerge -o output.mkv video.mp4 subtitle.srt
Corley Kinnane
źródło
3
Chcesz skomentować, dlaczego twoje podejście rozwiązałoby problem PO?
mjuarez