Verwenden Sie ffmpeg, um Textuntertitel hinzuzufügen [geschlossen]

120

Ich versuche, einem .mp4-Container mit ffmpeg Textuntertitel hinzuzufügen:

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

Wenn ich versuche, diese Zeile auszuführen, wird eine Fehlermeldung angezeigt:

Die Anzahl der Stream-Maps muss mit der Anzahl der Ausgabestreams übereinstimmen.

Wenn ich versuche, mp4 in mkv zu ändern (obwohl mp4 Textuntertitel unterstützt), so:

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

Es ordnet die Streams korrekt zu, gibt jedoch einen Fehler aus:

Encoder (Codec-ID 94210) für Ausgabestream # 0.2 nicht gefunden

Wenn ich starte

ffmpeg -codecs

Ich kann sehen, dass der srt-Codec als Decoder und Encoder unterstützt wird, bin mir jedoch nicht sicher, was für die MP4- und MKV-Subs-Codierung verwendet wird und ob ich ihn einschalten oder separat kompilieren muss.

0-alpha
quelle

Antworten:

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

-vf subtitles=infile.srt wird nicht funktionieren mit -c copy


Die Reihenfolge -c copy -c:s mov_textist wichtig. Sie sagen FFmpeg:

  1. Video: Kopie, Audio: Kopie, Untertitel: Kopie
  2. Untertitel: mov_text

Wenn Sie sie umkehren, sagen Sie FFmpeg:

  1. Untertitel: mov_text
  2. Video: Kopie, Audio: Kopie, Untertitel: Kopie

Alternativ können Sie auch -c:v copy -c:a copy -c:s mov_textin beliebiger Reihenfolge verwenden.

Steven Penny
quelle
13
Diese Methode fügt der Datei Untertitel als Stream hinzu, benötigt also Spielerunterstützung, um Untertitel (wie VLC)
anzuzeigen
1
Bedeutet dies, dass der Untertitel verfügbar ist, aber nicht in das Video eingebrannt wurde? Ich kann zeigen, ob ich auf Anfrage will?
So
3
Ja @ sunk818 das bedeutet das. Dadurch wird der Untertitel als Titel hinzugefügt, der aktiviert oder deaktiviert werden kann, solange der Player ihn unterstützt. Mr. Hyde und Paul ffmpeg können auch die Untertitel auf dem Video selbst hinzufügen, und in diesen Fällen würden Sie Dinge wie Schriftart und Positionierung steuern.
Boushley
1
.srt-Dateien müssen mit -c:s copynicht mit importiert werden -c:s mov_text.
GetFree
80

HINWEIS: Diese Lösung "brennt die Untertitel" in das Video, sodass jeder Betrachter des Videos gezwungen ist, sie zu sehen.

Verwenden Sie die libassBibliothek (stellen Sie sicher, dass Ihre ffmpeg-Installation die Bibliothek in der Konfiguration enthält --enable-libass).

Konvertieren Sie zuerst die Untertitel in das .assFormat:

ffmpeg -i subtitles.srt subtitles.ass

Fügen Sie sie dann mithilfe eines Videofilters hinzu:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
HdN8
quelle
39
Dadurch werden sie in das Video "eingebrannt", was bedeutet, dass Sie sie im Player nicht ausschalten können. Dies unterscheidet sich vom Hinzufügen als Untertitel-Stream, der vom Player gelesen und angezeigt werden kann, wenn der Betrachter sie möchte.
Stib
1
Vielen Dank für diese Lösung. Gibt es überhaupt eine Möglichkeit, die Größe der Zeichen anzugeben?
user1319182
1
Schauen Sie sich diese Antwort an: stackoverflow.com/questions/21363334/… . Möglicherweise möchten Sie die Schriftart in der Untertiteldatei selbst festlegen. Andernfalls können Sie mithilfe des Untertitelfilters force_style zwingen, die Schriftart festzulegen
HdN8
Dies ist nützlich, wenn Sie Untertitel für Videos wie Instagram hinzufügen. Irgendwo wie der Instagram-Viewer, bei dem der Benutzer keinen Ton oder Video hören kann, in einer anderen Sprache, kann der Benutzer stattdessen den Untertitel lesen
ϻαϻɾΣɀО-MaMrEzO
1
Installieren Sie libassErweiterungen, falls diese auf Debian-Systemen fehlen, mit "apt update && apt install libass-dev".
Sopalajo de Arrierez
53

Sie versuchen, Untertitel als Untertitel-Stream zu muxen. Es ist einfach, aber für MP4 (oder M4V) und MKV wird eine andere Syntax verwendet. In beiden Fällen müssen Sie einen Video- und Audio-Codec angeben oder nur den Stream kopieren, wenn Sie nur Untertitel hinzufügen möchten.

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
quelle
3
Ist es möglich, mehr als einen Untertitel hinzuzufügen? Wird dieser Softsub als unbekannte Sprache erkannt?
Patrick
1
Ja, so ist es. Ich habe es gerade für MKV getestet:
Dotokija
7
Fügen Sie zuerst eine weitere Eingabe hinzu: -i input2.srt. Zweitens ordnen Sie das als 2. Stream zu: -map 2: 0. Wählen Sie abschließend den Encoder für den zweiten Untertitel-Stream (der gleiche wie der erste): -c: s srt. Das vollständige Beispiel \ 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: eine Kopie \ -c: s srt -c: s srt output.mkv
dotokija
8
Und um Sprachmetadaten hinzuzufügen (vor Ausgabedatei einfügen) "-metadata: s: s: 0 language = eng"
Patrick
Wie kommt es, dass die Untertitel in der Originaldatei ausgeschlossen werden, wenn ich MKV-Dateien als MP4-Dateien "umwickle" (ffmpeg -i film.mkv -vcodec copy -acodec copy film.mp4)? Das ursprüngliche MKV hat Untertitel, die Ausgabe im MP4-Format jedoch nicht. Was ist los? Was mache ich nicht richtig?
Oldboy
9

Der MKV-Container unterstützt praktisch alles Video- und Audio-Codecs sowie Untertitel und DVD-Menüs. Sie können also einfach Codecs vom Eingabevideo zum Ausgabevideo mit MKV-Container mit Untertiteln kopieren. Zuerst sollten Sie SRT in das ASS-Untertitelformat konvertieren

ffmpeg -i input.srt input.ass

und betten ASS-Untertitel in Video ein

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

Arbeitete auch mit VMW-Datei.

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

Siehe die Wiki-Seite Vergleich der Containerformate

Khan
quelle
1
HV nicht wirklich relevant, es ist immer willkommen, mehr als eine Lösung zu sehen.
JasonXA
8

ffmpeg unterstützt den mov_textUntertitel-Encoder, der ungefähr der einzige ist, der in einem MP4-Container unterstützt wird und von iTunes, Quicktime, iOS usw. abgespielt werden kann.

Ihre Zeile würde lauten:

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

Mirko Klemm
quelle
5

Ich habe versucht, MP4Box für diese Aufgabe zu verwenden, aber es konnte nicht mit dem M4V umgehen, mit dem ich es zu tun hatte. Ich hatte Erfolg beim Einbetten der SRT als weiche Untertitel mit ffmpeg mit der folgenden Befehlszeile:

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

Wie Sie musste ich eine MKV-Ausgabedatei verwenden - ich konnte keine M4V-Datei erstellen.

D Coetzee
quelle
3

Ich werde eine einfache und allgemeine Antwort geben, die mit einer beliebigen Anzahl von Audios und srt- Untertiteln funktioniert und die Metadaten berücksichtigt , die den mkv- Container enthalten können. So werden sogar die Bilder hinzugefügt, die die Matroska möglicherweise als Anhänge enthält (obwohl dies kein anderer AFAIK-Typ ist), und sie werden in Spuren konvertiert. Sie werden nicht in der Lage sein zu sehen, aber sie werden da sein (Sie können sie demuxen). Ah, und wenn der mkv Kapitel hat, dann auch den mp4 .

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

Wie Sie sehen, dreht sich alles um das -map 0, was FFmpeg anweist, alle Spuren hinzuzufügen, einschließlich Metadaten, Kapitel, Anhänge usw. Wenn es eine nicht erkannte "Spur" gibt ( mkv erlaubt das Anhängen eines beliebigen Dateityps), wird dies der Fall sein Beenden Sie mit einem Fehler.

Sie können einen einfachen Stapel erstellen mkv2mp4.bat, wenn Sie dies normalerweise tun, um eine mp4 mit demselben Namen wie das mkv zu erstellen . Es wäre besser mit Fehlerkontrolle, einem anderen Ausgabenamen usw., aber Sie bekommen den Punkt.

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

Jetzt können Sie einfach laufen

mkv2mp4 "Video with subtitles etc.mkv"

Und es wird "Video mit Untertiteln etc.mp4" mit dem Maximum an Informationen erstellt.

cdlvcdlv
quelle
-1

Einfaches Beispiel:

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

Ersetzen Sie nur die Linux-Variablen

Daniel Gianni
quelle
Möchtest du das näher erläutern?
RamenChef
-3

Dies ist der Grund, warum mkv ein so guter Container ist, besonders jetzt, wo er ausgereift ist:

mkvmerge -o output.mkv video.mp4 subtitle.srt
Corley Kinnane
quelle
3
Möchten Sie kommentieren, warum Ihr Ansatz das Problem des OP beheben würde?
Mjuarez