FFmpeg, Video für 720p @ 4mbps-Wiedergabe kodieren

Ich kämpfe jetzt seit ungefähr ein oder zwei Wochen mit diesem Dilemma und habe mein Bestes versucht, es aus allem, was ich über Google finden kann, zu verstehen.

Was ich tun muss (oder zumindest denke, dass ich es tun muss), ist die Bitrate zu berechnen, um die Mbit / s zu bestimmen. Wenn sie über meiner Anforderung liegt (720p bei 4 Mbit / s), möchte ich das Video optimieren. Wenn sie unter meiner Anforderung liegt, ist es nur a Es geht darum, die Datei in einen mp4-Container zu kopieren.

Jetzt habe ich meinen eigenen Code für FFmpeg, den ich unten anhängen werde, und ich habe festgestellt, dass es alternative Anwendungen gibt, die mir aus der Datei berechnete kbps liefern, aber ich möchte so viel wie möglich mit nur einer Anwendung tun, wenn Ich kann.

Ich bitte niemanden, hier etwas zu codieren, sondern mir zu sagen, wie ich dies selbst berechnen kann, indem ich die Informationen verwende, die ich von FFmpeg oder sogar FFprobe erhalte, und welche Parameter ich in FFmpeg einstellen müsste, um sicherzustellen, dass die Die Videodatei ist für das Streamen mit 4 MBit/s codiert.

ffmpeg -i "input.file" -map 0:0 -map 0:1 -map 0:1 -r 30 -profile:v Main -level:v 4.0 -crf 19 -c:a:0 copy -b:a:0 448k -metadata:s:a:0 language="english" -metadata:s:a:0 title="AC3 5.1" -c:a:1 libfdk_aac -ac:a:1 2 -b:a:1 160k -metadata:s:a:1 language="english" -metadata:s:a:1 title="AAC Stereo" -movflags +faststart "output.file"

Danke im Voraus.

Aktualisieren Sie auf meinen ursprünglichen Code

Dieser neue Code enthält die Bitrate buffsize und maxrate (falls erforderlich), in meinem Skript wird es auf 30 gesetzt, wenn die fps über 30 liegt, andernfalls wurde es in Ruhe gelassen, aber wenn die fps unsicher ist, Beispiel 23,970542342, kann dies produzieren ein Fehler in FFmpeg, ich dachte, "-r 23.97" würde dies beheben, aber anscheinend nicht, also musste ich "-r" in "-filter:v fps=" ändern und die fps für meine Dateien durch Berechnung der "r_frame_rate" festlegen , was einfach genug ist.

Mein neuer Code

ffmpeg -i "input.file" -map 0:0 -map 0:1 -map 0:1 -filter:v fps=30 -profile:v Main -level:v 4.0 -crf 18 -b:v 4000k -bufsize 4000k -maxrate:v 4000k -metadata title="" -metadata year="" -c:a:0 copy -metadata:s:a:0 language="english" -metadata:s:a:0 title="AC3 5.1" -c:a:1 libfdk_aac -ac:a:1 2 -b:a:1 160k -metadata:s:a:1 language="english" -metadata:s:a:1 title="AAC Stereo" -movflags +faststart "output.file"

In dem Skript, das ich baue, wird es die entsprechenden Parameter für FFmpeg generieren, also wenn der Codec nicht x264 ist, wenn profile:v nicht main ist, wenn level:v nicht 4.0 ist, wenn bit_rate mehr als 4000k ist, dann werden alle benötigten Parameter gesetzt, sonst wird es kopiert.

FFprobe-Code von Mulvya, leicht modifiziert, damit ich alles bekommen kann, was ich brauche.

ffprobe -v error -select_streams v -show_entries stream="bit_rate,codec_name,profile,level,r_frame_rate" -of compact=p=0:nk=1 "input.file"

Ziel am Ende ist es, mein eigenes Automatisierungsskript zu haben, um meine Videos aus einem Ordner zu codieren. Ich kenne den Sickbeard-MP4-Automator, aber ich brauche nicht alle diese Funktionen, und es gibt Dinge, die ich möchte, die er nicht hat .

Antworten (1)

Der folgende ffprobe-Befehl spuckt die Bitrate aus:

ffprobe in.mp4 -select_streams v -show_entries stream=bit_rate -of compact=p=0:nk=1

z.B

4118620

Wenn das Ergebnis größer als 4000000ist, können Sie hinzufügen -b:v 4000k -bufsize 4000k -maxrate:v 4000k. Oder Sie können es trotzdem hinzufügen. Auf setzen -c:v, copywenn der Stream unter 4000000else to ist libx264. Die drei Werte werden genauso wie -b:a:0 448kin Ihrem Befehl ignoriert.

Danke @Mulvya, die bit_rate war etwas verwirrend für mich, also nehme ich an, dass bit_rate Bits pro Sekunde ist? und 4000000 = 4 Mbit/s?, ich werde das testen und mich so schnell wie möglich zurückmelden. Der Befehl "-b:a:0 448k" und sogar "-b:a:1 160k" wird nicht ignoriert, wenn ich mein aktuelles Skript ausführe, wenn ich die Informationen ausgeben sollte, zeigen beide Audiostreams an, was ich eingestellt habe , was bit_rate angeht, habe ich nicht daran gedacht, es einfach mit der gesamten bit_rate zu vergleichen, ich dachte, es steckt mehr dahinter als das, lol.
Wenn für einen Stream auf c:agesetzt ist, ist der inert, da keine Codierung durchgeführt wird. copyb:a
Ah richtig, ich habe mir die Dateien angesehen, die bereits das 448k-Audio hatten, also macht es Sinn, warum es immer dasselbe war wie meine Ausgabe, lol. Nur ein kurzer Gedanke und letzte Frage lol, kann ich nicht einfach "-maxrate:v" während der Codierung alleine verwenden, um sicherzustellen, dass meine Anforderung nicht überschritten wird? oder wäre es praktischer, "-b:v" und "-buffsize" einzufügen?
Wenn -b:vnicht festgelegt ist, wird der Standardwert (200 KB) verwendet, oder im Fall von x264 wird der CRF-Modus anstelle des Bitraten-Targeting verwendet.