FFmpeg: Entfernen Sie nicht unterstützte Untertitel-Streams (MKV)

553
Wolveix

Ich mache ein Skript, das eine Liste von Mediendateien durchläuft und diese dann mit FFmpeg neu codiert. Mein Problem ist, dass ich alle Untertitel entfernen muss, die der MKV-Container nicht unterstützt. Bei Verwendung einer negativen Zuordnung sollte dies einfach sein. Die Stream-Nummer ist jedoch für jede Datei unterschiedlich. Hier ist mein aktueller Befehl:

ffmpeg -y -i "path/to/file.ext" -map 0 -c:v libx264 -crf 20 -level 4.1 -profile:v high -c:a copy -q:a 100 -preset faster -strict -2 -movflags faststart -threads 2 -nostdin -stats "file.mkv" 
1

1 Antwort auf die Frage

2
Wolveix

Ich glaube nicht, dass FFmpeg dies nativ unterstützt. Es ist mir gelungen, ein Skript zu schreiben, das ein oder mehrere Vorkommen zulässt:

stream_count=$(/usr/bin/ffprobe -select_streams s -show_entries stream=index,codec_name -of csv=p=0 "path/to/file.ext" |& grep -cE 'Subtitle: dvd_subtitle|Subtitle: hdmv_pgs' || :) if [ "$stream_count" -gt 0 ] then stream_id=$(/usr/bin/ffprobe -select_streams s -show_entries stream=index,codec_name -of csv=p=0 "path/to/file.ext" |& grep -E 'Subtitle: dvd_subtitle|Subtitle: hdmv_pgs' || :) if [ "$stream_count" = 1 ] then exclude_stream=$(echo "$stream_id" | grep -oP '0:[0-9]') exclude_stream="-map -$exclude_stream" else counter=0 until [ "$counter" = "$stream_count" ] do counter=$((counter+1)) excluded_stream="$(echo "$stream_id" |& grep -oP '0:[0-9]' |& sed -n "$"p)" if [ ! -z "$excluded_stream" ] then if [ "$exclude_stream" = "*$excluded_stream*" ] #If ffprobe returns encode errors within the streams, double results may be returned for the problematic stream which this circumvents then counter="$stream_count" else exclude_stream="$exclude_stream -map -$excluded_stream" fi fi excluded_stream="" done fi fi ffmpeg -y -i "path/to/file.ext" -map 0 $exclude -c:v libx264 -crf 20 -level 4.1 -profile:v high -c:a copy -q:a 100 -preset faster -strict -2 -movflags faststart -threads 2 -nostdin -stats "file.mkv" #exclude isn't wrapped as it invalidates the opening hyphen 

Wenn jemand Vorschläge zur weiteren Verbesserung dieses Skripts hat, würde ich mich sehr freuen, sie zu hören.

Vielen Dank @LordNeckbeard für die vorgeschlagenen Änderungen am Befehl ffprobe.

Ich finde es einfacher und konsistenter, die maschinenlesbare Ausgabe zu parsen als die vom Menschen lesbare Ausgabe: `ffprobe -loglevel error -select_streams s -show_entries stream = index, codec_name -of csv = p = 0 input.ext` LordNeckbeard vor 5 Jahren 2
@LordNeckbeard Danke für den Vorschlag. Ich musste das Loglevel-Flag entfernen, da möglicherweise Fehler in den gefundenen Streams auftreten Wolveix vor 5 Jahren 0
Sie können `-profile: v` und` -level` weglassen und den Encoder wählen lassen, es sei denn, Sie benötigen ein eingeschränktes Wiedergabegerät. Mit -threads können Sie den Encoder automatisch behandeln lassen. "-strict -2" wird nicht benötigt, es sei denn Ihr ffmpeg ist alt und verwendet den zuvor experimentell integrierten AAC-Encoder. [FFmpeg WIki: AAC] (https://trac.ffmpeg.org/wiki/Encode/AAC) sagt, dass der "effektive Bereich für" -q: a "bei 0,1 bis 2 liegt schlechtere Ergebnisse als die CBR (`-b: a`)". Ich habe das nie untersucht, daher kann ich diese Aussage nicht kommentieren. LordNeckbeard vor 5 Jahren 1
`-level`,` -profile: v` und `-threads` sind aufgrund der beabsichtigten Verwendung des Skripts absichtlich da. Das Auslassen von "-strict -2" hat in der Vergangenheit Probleme verursacht, aber ich habe es in letzter Zeit nicht getestet. Interessant über `-q: a`, habe ich auf Empfehlung hinzugefügt. Danke für die Information! Wolveix vor 5 Jahren 0
Ich habe -strict -2 entfernt und es sind keine Probleme aufgetreten. Vielen Dank für die Einsicht. Wolveix vor 5 Jahren 0