Ich arbeite an einem Projekt, das den Benutzern Video-Streaming über das Internet sowohl auf Webbrowsern als auch auf mobilen Geräten bietet.
Ich verwende folgenden Beispielbefehl FFMPEG
für transcode
das Video:
ffmpeg -y -i inputvideo.mp4 -async 1 -metadata:s:v:0 start_time=0
-s 1280x720 -vcodec libx264 -strict experimental -pix_fmt yuv420p
-profile:v baseline -movflags +faststart -acodec aac -profile:a aac_low
-b:v 2000k -refs 6 -coder 1 -sc_threshold 40 -flags +loop -me_range 16
-subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -trellis 1 -b:a 128k outputvideo.mp4
Der Befehl wird dynamisch mithilfe der Programmiersprache generiert, nachdem die Videodetails nach dem Hochladen abgerufen wurden. Was ich tue, ist, einfach Bitrate, Höhe und Breite des Videos mit den folgenden Einstellungen zurückzusetzen:
Wenn height >= 720
Sie es dann auf einstellen 720
, wird die Breite automatisch entsprechend der Höhe eingestellt und beträgt bit-rate
,5000k
Wenn height >= 480
Sie es dann auf einstellen 480
, wird die Breite automatisch entsprechend der Höhe eingestellt und beträgt bit-rate
,2500k
Wenn height >= 360
Sie es dann auf einstellen 360
, wird die Breite automatisch entsprechend der Höhe eingestellt und bit-rate
wird sein1000k
Ich habe diese Logik von diesem Link .
Ich möchte jedoch die Videoqualität um 25-30 % mehr herabstufen, da Standbilder größer sind, als ich nach der Transcodierung vermute, und die Datengebühren mehr kosten.
Bei der Suche danach habe ich einen anderen Link gefunden , der eine andere Bitrate hat als der, den ich verwende. Ich bin mir nicht sicher, welches besser ist.
Kann mir jemand vorschlagen, wie ich die Videos um 25-30 % mehr als die aktuelle Einstellung verkleinern kann, ohne die Qualität des Videos mehr zu beeinträchtigen?
Anstatt eine konstante Bitrate zu verwenden, versuchen Sie es mit einer konstanten Qualität (AKA Constant Rate Factor oder crf).
Also anstatt zu -b:v 2000
verwenden -crf 23
(Anzahl anpassen, um die Qualität zu ändern, höher ist kleiner/geringere Qualität und niedriger ist größer/bessere Qualität).
Konstante Qualität gibt Ihnen normalerweise mehr Leistung für Ihre Bits, da die Bitrate dort gespart wird, wo sie nicht wirklich benötigt wird. Es macht auch zusätzliches Scripting für unterschiedliche Größen überflüssig, da es automatisch die Bitrate für kleinere Frame-Größen senkt.
Sie können auch die x264-Voreinstellungen wie -preset slower
oder verwenden -preset veryslow
, um x264 zu erhalten, um mehr Zeit mit der Optimierung zu verbringen. Außerdem entfällt die Notwendigkeit, alle zusätzlichen Codierungs-Flags hinzuzufügen – die Voreinstellungen sind im Grunde fertige Codierungs-Flags (vermutlich von Leuten erstellt, die wissen, was sie tun). Mehr zur x264-Kodierung hier
Ihr Befehl könnte also so aussehen:
ffmpeg -y -i inputvideo.mp4 -async 1 -metadata:s:v:0 start_time=0 -s 1280x720 -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -movflags faststart -profile:a aac_low -preset slower -crf 23 -b:a 128k outputvideo.mp4
Ich glaube nicht, dass Sie das -strict-experimental
Flag brauchen, es sei denn, Sie haben eine alte Version von ffmpeg.
Jim Mack