2011-12-29 19 views
60

Próbuję dodać tekstowych napisów do pojemnika .mp4 użyciu ffmpeg:Zastosowanie ffmpeg aby dodać tekst napisy

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

Kiedy próbuję uruchomić tę linię, to daje mi błąd:

Liczba map strumienia musi być zgodna z liczbą strumieni wyjściowych.

Gdy próbuję zmienić mp4 do MKV (choć mp4 obsługuje tekstowych napisów), podobnie jak to:

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

poprawnie odwzorowuje on strumienie, ale daje błąd:

Nie znaleziono kodera (kodek id 94210) dla strumienia wyjściowego nr 0.2

Po uruchomieniu

ffmpeg -codecs 

widzę, że kodek srt jest obsługiwany jako dekoder i enkoder, jednak nie jestem pewien, co służy do MP4 i MKV kodowania Subs, i czy muszę je włączyć lub skompilować oddzielnie.

Odpowiedz

27

Użyj biblioteki libass (upewnij się, że instalowana ffmpeg ma bibliotekę w konfiguracji --enable-libass).

najpierw przekonwertować napisy do formatu .ass:

ffmpeg -i subtitles.srt subtitles.ass 

Następnie dodać je za pomocą filtru wideo:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4 
+0

to działa na mnie, dzięki. –

+17

Spowoduje to "nagrywanie ich" na wideo, co oznacza, że ​​nie można ich wyłączyć w odtwarzaczu. Różni się to od dodawania ich jako strumienia napisów, które mogą być odczytywane przez odtwarzacz i wyświetlane, jeśli użytkownik ich chce. – stib

+0

Bardzo dziękuję za to rozwiązanie. Czy mimo to można określić rozmiar znaków? – user1319182

3

Próbowałem za pomocą MP4Box dla tego zadania, ale to nie może obsłużyć M4V Miałem do czynienia. Miałem sukces osadzanie SRT jako miękkie napisy z ffmpeg z następującym wierszu 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

Jak ty musiałem użyć plik wyjściowy MKV - nie był w stanie utworzyć plik M4V.

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

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


Kolejność -c copy -c:s mov_text jest ważne.Mówisz FFmpeg:

  1. wideo: Kopiowanie, Audio: kopiować, napisów: skopiuj
  2. Napisy: mov_text

Jeśli je odwrócić, mówisz FFmpeg:

  1. Podtytuł: mov_text
  2. Wideo: kopiowanie, audio: kopiowanie, podtytuł: kopiowanie

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

+0

Gdzie jest pozycja! ? Top?! Dolny?! Centrum?! –

+4

Ta metoda dodaje napisy do pliku jako jeden ze strumieni, więc potrzebna jest obsługa odtwarzacza, aby wyświetlać podtytuły (takie jak VLC). – BollMose

+0

Czy to oznacza, że ​​podtytuł jest dostępny, ale nie jest nagrany na wideo? Mogę pokazać, czy chcę na żądanie? – Sun

5

ffmpeg obsługuje enkoder mov_text napisów, który jest o jedyny obsługiwany w kontenerze MP4 i odtwarzane przez iTunes, QuickTime, iOS itp

Twoja linia będzie czytać:

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

4

MKV kontener obsługuje kodeki wideo i audio Praktycznie wszystko, a także obsługuje napisy i menu DVD. Więc możesz po prostu skopiować kodeki z wejściowego wideo do wyjścia wideo z pojemnikiem MKV z napisami. Najpierw należy przekonwertować do formatu SRT napisów ASS

ffmpeg -i input.srt input.ass 

i osadzić ASS napisy do filmu

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ł z pliku 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 

zobaczyć stronę wiki Comparison of container formats

+1

HV naprawdę mało istotne, zawsze można zobaczyć więcej rozwiązań niż jeden. – JasonXA

-3

To jest powód, dlaczego mkv jest taki dobry pojemnik, zwłaszcza teraz, że jest dojrzały:

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

Czy chcesz skomentować, dlaczego Twoje podejście rozwiązałoby problem PO? – mjuarez

28

Próbujesz mux napisy jako napisy strumień. Jest to łatwe, ale dla MP4 (lub M4V) i MKV używana jest inna składnia. W obu przypadkach musisz określić kodek audio i wideo, 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 
+0

Czy można dodać więcej niż jeden podtytuł? Czy ten softsub zostanie rozpoznany jako język nieznany? – Patrick

+0

Tak, jest. Właśnie przetestowałem to dla MKV: – dotokija

+3

Najpierw dodaj kolejne wejście: -i input2.srt. Po drugie, mapuj jako drugi strumień: -mapa 2: 0. Na koniec wybierz koder dla drugiego strumienia napisów (taki sam jak pierwszy): -c: s 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: kopia \ -c: s srt -c: s srt output.mkv – dotokija

-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" 

wymienić tylko zmienne linux

+0

Chcesz opracować? – RamenChef

Powiązane problemy