Konvertieren Sie H.265 mkv in H.264 mit ffmpeg, um Dateien für die Neucodierung kompatibel zu machen

31

Ich habe H.265-codierte Dateien, die so ressourcenintensiv sind, dass sie nicht gut abgespielt werden können, und meine Konvertierungssoftware (Mencoder) unterstützt (derzeit) das H.265-Format nicht. Kann ich sie in einer Befehlszeilen-Batchdatei in H.264 konvertieren, um die Dateien mit Devede / OGMrip schnell für die Neukomprimierung zu konvertieren? Beim Durchsuchen dieser Website habe ich keine Diskussion gefunden, daher werde ich eine meiner Meinung nach nützliche Frage und Antwort auf die Frage veröffentlichen.

TheMegolith
quelle

Antworten:

37

Ja, mit ffmpeg.

Öffnen Sie ein Terminal und leiten Sie es in das Verzeichnis mit den H.265-codierten Dateien, sofern Sie ffmpegdie entsprechenden Bibliotheken installiert und im MKV-Format vorliegen. Kopieren Sie die folgenden Dateien und fügen Sie sie in das Terminalfenster ein.

INPUT="$1"
for i in *.mkv ; do
    ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
    mv "$i.ts" "$i.mpg"
    sleep 3
done

Hier hast du es. Dies wird in einem MPG-Container im selben Verzeichnis in h.264 konvertiert.

Erklärung der Befehlsschalter:

  • for i in *.mkv ; do ... done

    Dadurch werden alle MKV-Dateien in einem Verzeichnis eingerichtet, die in den Stapelverarbeitungsprozess einbezogen werden sollen. Dies kann geändert werden, um die Containererweiterung der zu verarbeitenden Dateien aufzunehmen.

  • ffmpeg -i "$i" Führt das Programm ffmpeg aus und fordert zur Bearbeitung von Dateien auf.

    • -bsf:v Aktiviert den zu verwendenden Videobitstromfilter.

    • h264_mp4toannexb - Ist der Bitstromfilter aktiviert?

      Konvertieren eines H.264-Bitstroms aus dem Längenpräfixmodus in den Codepräfixmodus (wie in Anhang B der ITU-T-H.264-Spezifikation definiert).

      Dies wird von einigen Streaming-Formaten benötigt. In der Regel mpegtserfordert dies das MPEG-2-Transport-Stream-Format ( ), das MKV h.264 verarbeitet. Wenn es nicht enthalten ist, wird im Terminalfenster eine Fehlermeldung angezeigt, die Sie zur Verwendung auffordert.

    • -sn Stoppt das Streaming von Untertitel-Streams (für diejenigen, die keine Untertitel in ihrem Video haben möchten). Dies ist optional und kann entfernt werden.

    • -map 0:0 -map 0:1Weist ffmpeg an, nur die ersten beiden Streams der Datei zu verarbeiten ( 0:0ist der Video-Stream, 0:1ist der erste Audio-Stream der Datei). Dies macht zwei Dinge, entfernt die überschüssigen Audio-Streams, normalerweise ist der erste Audio-Stream Englisch, aber nicht immer. Andere Streams wie eingebettete Untertitel werden entfernt, wodurch die Dateigröße verringert wird. Dies ist auch eine optionale Zeichenfolge. Mit können Sie ffprobedie in der Datei verfügbaren Streams anzeigen. -mapist optional und kann aus dem Befehl entfernt werden.

    • -vcodec libx264 Dadurch wird ffmpeg angewiesen, die Ausgabe in H.264 zu codieren

    • "$i.ts" Speichert die Ausgabe im .ts-Format. Dies ist nützlich, um Ihre Quelldateien nicht zu überschreiben.

  • mv "$i.ts" "$i.mpg"Konvertiert die Dateierweiterung in MPG im selben Verzeichnis. Dies kann so eingestellt werden, dass es an ein beliebiges Verzeichnis gesendet wird.

  • sleep 3 - Ermöglicht dem Prozess eine Pause, sodass ffmpeg Zeit hat, die nächste Datei in die Warteschlange zu stellen

TheMegolith
quelle
3
Ausgezeichnet! Jetzt können wir die Kommentare unter der Frage löschen. Ich würde sagen, das sleep 3ist unnötig (aber möglicherweise nützlich, um die Schleife zu beenden) und INPUT=$1bedeutungslos, da Sie dies direkt in einer interaktiven Shell ausführen.
muru
11
Ziehen Sie in Betracht , das Audio mit Stream zu kopieren,-c:a copy anstatt es neu zu codieren. 0:0Verweisen Sie außerdem möglicherweise nicht immer auf Video und 0:1möglicherweise nicht immer auf Audio. Sie können einen Stream-Bezeichner verwenden, um mögliche Probleme zu vermeiden: -map 0:v -map 0:aWenn Sie alle Video- und Audiostreams von Eingang 0 oder -map 0:v:0 -map 0:a:0nur die ersten Video- und Audiostreams von Eingang 0 möchten. Wenn Sie nur den englischen Audiostream möchten: -map 0:m:language:eng(vorausgesetzt, ist beschriftet).
Logan
1
@LordNeckbeard Ich werde dafür stimmen, dass Sie eine vollständige Antwort schreiben.
Fran Marzoa
1
@Fran Ich habe nicht bemerkt, dass es zu diesem Kommentar so viele positive Stimmen gibt. Ich habe eine Antwort mit einfacheren, weniger fehleranfälligen und effizienteren Methoden hinzugefügt .
Logan
1
Ich würde ganz einfach mitgehen ffmpeg -i $INPUT -vcodec h264 -acodec copy $OUTPUT. Etwas, das ich jeden Tag benutze und tatsächlich auswendig lernen kann, im Gegensatz zu dem Flut bedeutungsloser Flaggen, für die jede Antwort auf ffmpeg so berüchtigt ist.
Ben Sinclair
20

Batch-Konvertierung von H.265 nach H.264

Diese Beispiele wurden kürzlich geschrieben ffmpeg. Sparen Sie sich Ärger und laden Sie eine aktuelle Version herunter . Geben Sie dann die ffmpegBinärdatei ein ~/binoder /usr/local/bin(möglicherweise müssen Sie sich abmelden und dann anmelden, damit dies bemerkt wird).

Matroska-Ausgabe

mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
  • Dieses Beispiel wird in ein Verzeichnis mit dem Namen ausgegeben h264vids.

  • In diesem Beispiel wird davon ausgegangen, dass Ihre Eingaben wie folgt lauten .mp4. Wenn nicht, ändern Sie die .mp4Instanz im Beispiel in Ihren Eingabedateityp, oder verwenden Sie einfach den gierigen Dateityp *.

  • Passen Sie die -crfQualität und die -presetCodierungsgeschwindigkeit / -effizienz an. Oder entfernen Sie einfach diese Optionen und verwenden Sie die Standardeinstellungen, die für die meisten ausreichend sind (im Beispiel werden die Standardwerte für diese Optionen verwendet). Weitere Informationen zu diesen Optionen finden Sie im FFmpeg-Wiki: H.264 .

MP4-Ausgang

Dieser ist etwas komplizierter. Dies führt eine bedingte Codierung durch, abhängig davon, ob der Audioeingang AAC ist oder nicht. Wenn der Audioeingang AAC ist, wird der Audio-Stream unverändert kopiert (erneut gemuxt), und unnötige Neucodierungen werden vermieden. Wenn der Audioeingang nicht AAC ist, wird er in AAC umcodiert.

Hier ist ein einfaches Skript, das zeigt, wie dies mit ffprobeund gemacht wird ffmpeg. Kopieren und speichern Sie es in das Verzeichnis, in dem sich Ihre zu konvertierenden Videos befinden. Geben Sie ihm die Ausführungserlaubnis chmod +x yourscriptname, und führen Sie es dann mit aus ./yourscriptname.

#!/bin/bash

mkdir h264vids

for f in *.mkv
do
  audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
  if [ "$audioformat" = "aac" ]; then
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
  else
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
  fi
done
  • Dieses Beispiel wird in ein Verzeichnis mit dem Namen ausgegeben h264vids.

  • In diesem Beispiel wird davon ausgegangen, dass Ihre Eingaben wie folgt lauten .mkv. Wenn nicht, ändern Sie die .mkvInstanz im Beispiel in Ihren Eingabedateityp, oder verwenden Sie einfach den gierigen Dateityp *.

  • Siehe Hinweis oben zu -crfund -preset.

  • Sie können die Kodierung mit ctrl+ zanhalten und mit fortsetzen fg.

Logan
quelle
0

In Anbetracht der vorherigen Antworten habe ich Folgendes gefunden:

for file in *265.mkv; do nice -n19 ffmpeg -i $file -c copy -c:v libx264 ${file/%265.mkv/264.mkv}; done

Dies setzt voraus, dass die Dateien immer einen Namen haben, der auf endet 265.mkv. Dieses Ende wird durch ersetzt 264.mkv.

Wenn Ihre Dateinamen unterschiedlich sind, müssen Sie den Befehl entsprechend anpassen.

kerner1000
quelle