Es ist ein bisschen schwierig, aber hier ist eine Arbeitsmethode:
INFILE=input.ts OUTFILE=output.mkv ffmpeg \ -i "$" \ -f lavfi -i movie="$[out+subcc]" \ -map 0 -map 1:s \ -codec:v libx264 \ -codec:a copy \ -codec:s srt \ -metadata:s:s:0 language=eng \ "$"
Hier input.ts
und output.mkv
sind Ihre gewünschten Eingabe-MPEG-TS- bzw. Ausgabe-Matroska-Dateien. Die Verallgemeinerung auf ein Skript bleibt dem Leser als Übung überlassen.
Interpretation der Parameter, Zeile für Zeile:
-i ...
ist die Eingabedatei.
-f lavfi -i ...
erlaubt uns, den eingebetteten Untertitelstrom zu extrahieren.
-map 0 -map 1:s
wählt die Streams für die Ausgabe aus.
-codec:v libx264
weist ffmpeg an, Video in H.264 zu konvertieren.
-codec:a copy
kopiert alle Audioströme unverändert in die Ausgabe.
-codec:s srt
weist ffmpeg an, die eingebetteten Bildunterschriften in SRT zu konvertieren.
-metadata:s:s:0 language=eng
Setzt die Untertitel-Stream-Sprache auf Englisch.
Anmerkungen:
- Ich habe dies nur mit Over-the-Air-ATSC-Streams verwendet, einschließlich EIA-608-Untertiteln. Ich habe keine Ahnung, ob es mit QAM-Aufnahmen (Kabelaufnahmen) funktioniert, obwohl ich davon ausgehe, dass dies der Fall ist.
- Möglicherweise haben Sie Probleme mit Eingabedateinamen, die bestimmte Zeichen enthalten, auch wenn Sie den Dateinamen in Anführungszeichen setzen.
- Dadurch werden alle Audioströme kopiert. Wenn Sie nur den ersten wollen, müssen Sie einzelne Streams aus Eingang 0 explizit zuordnen.
- Die Audio-Streams verfügen möglicherweise bereits über eine Sprache. Wenn dies nicht der Fall ist, fügen Sie eine weitere Option -metadata hinzu, um auch die Sprache des Audiostreams festzulegen.
- Sie werden wahrscheinlich mit der Videokodierungsqualität mit der Option -crf experimentieren möchten. Wenn Ihr Eingangsvideo interlaced ist, möchten Sie möglicherweise deinterlacen und auf 720p skalieren, indem Sie
-filter:v bwdif=0,scale=1280:720
nach den-map
Zeilen hinzufügen .