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 .
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 4000000
ist, 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
, copy
wenn der Stream unter 4000000
else to ist libx264
. Die drei Werte werden genauso wie -b:a:0 448k
in Ihrem Befehl ignoriert.
Rycore
Gyan
c:a
gesetzt ist, ist der inert, da keine Codierung durchgeführt wird.copy
b:a
Rycore
Gyan
-b:v
nicht festgelegt ist, wird der Standardwert (200 KB) verwendet, oder im Fall von x264 wird der CRF-Modus anstelle des Bitraten-Targeting verwendet.