FFMPEG / x264: Kann ich Pass 1 einer Codierungssitzung als Pass 2 für eine andere verwenden?

698
Mark Gerolimatos

Frage:

Ist es legal, eine "Pass 1" -Codierung eines Quellvideos mit einer Auflösung / Bitrate als Eingabe für eine "Pass 2" -Codierung derselben Quelle bei einer anderen Auflösung / Bitrate zu verwenden? Ich habe es ausprobiert und seeeeeeems funktioniert, aber ich bin mir nicht sicher, ob es im allgemeinen Fall so ist: Das Stream-Profil (I / P / B-Frame-Auswahl usw.) sieht anders aus, als wenn Sie die gleichen Parameter für beide Durchläufe verwenden, aber auch sieht "gut genug" aus.

Ich bin an dem Punkt, an dem ich eine autoritative Antwort auf diese Frage brauche.

Warum in tarnation 1 würden Sie das tun?

Da die Codierung mit zwei Durchläufen einen irritierenden Fehler in FFMPEG (x264, wirklich) behebt, wird dieser wahrscheinlich nicht so schnell behoben: Je nach Geschwindigkeit Ihres Computers ist die erste Sekunde des Videos oft ungeeignet Bitrate. Dies kann sehr einfach mit einem Quellenstrom mit hoher Bitrate reproduziert werden, der auf einer sehr schnellen Maschine (z. B. einer EC2-c4.8xlarge ) in eine niedrige Bitrate umcodiert wird . Ein i7 Quadcore MacBook Pro im Leerlauf ist NICHT ausreichend, um diesen Fehler zu reproduzieren.

Es wird entweder übermäßig hoch sein:

  • Single Pass-CBR ohne Angabe einer VBV

    (ignorieren Sie die Tatsache, dass CBR ohne VBV überhaupt nicht CBR ist )

oder zu niedrig:

  • Single Pass CBR mit VBV
  • Single Pass VBR: QScale mit VBV und Maxrate

Sowohl die VIFp- als auch die SSIM-Qualitätsmessungen zeigen, dass die niedrigeren / hohen Bitraten tatsächlich einer unnötig reduzierten / erhöhten Qualität entsprechen (dh die Bitrate sollte NICHT höher oder niedriger gewesen sein).

Doing a two-pass CBR - Codierung arbeitet groß und löst das Problem ... wenn Sie die Zeit dafür haben. Leider kann ich mir die Latenz einer Zwei-Pass-Kodierung für eine einzige Auflösung nicht leisten.

Was wollen Sie also tun?

Ich führe gerade eine erste Transkodierung mit einer niedrigeren Auflösung (480) durch. Dies wird so viele Wiedergabegeräte wie möglich abdecken. Ich möchte das als Pass 1 verwenden. Da die Auflösung von 480 ohnehin scheiße ist, kann ich das Pass-1-Video einfach als 480 anzeigen, unabhängig von dummen Bitraten in der ersten Sekunde des Videos.

Ich möchte dann die 480 Pass 1-Info verwenden und nur 2 für meine höheren Auflösungen. Im Fall von CBR / VBV wäre dies:

ffmpeg -i source.mp4 -pass 1 -vf scale=852:480 -c:v libx264 -b:v 1000k ... 480.mp4 ffmpeg -i source.mp4 -pass 2 -vf scale=1280:720 -c:v libx264 -b:v 2500k ... 720.mp4 

Barney Google

0
Kannst du bitte das komplette FFmpeg-Protokoll posten? Ich habe das Gefühl, dass Ihre Kodierungen zu viele Threads verwenden, wenn Sie diese niedrigen Auflösungen verwenden, was sich negativ auf die Qualität auswirkt. Ely vor 8 Jahren 0
Auf welchen Fehler beziehen Sie sich? LordNeckbeard vor 8 Jahren 0
Bitte beachten Sie diesen Link: http://ffmpeg.gusari.org/viewtopic.php?f=11&t=2296&p=6652 Mark Gerolimatos vor 8 Jahren 0
@ Ely Hallo, Ely! Ich bin es, Mark! Ich bin immer noch nicht überzeugt, dass dies ein Thread-Thema ist, oder bin vielleicht überzeugt, dass das zu viele Thread-Problem ein roter Hering ist, indem es lediglich den Fehler aktiviert. Denken Sie daran, dass ich bei einer hohen Bitrate ein Bündel Threads und sehr schnelle Maschinen benötige, um eine zeitnahe Transcodierung zu gewährleisten. Mark Gerolimatos vor 8 Jahren 0
@LordNeckbeard (erneuert, um eine "at" / Benachrichtigung zu erhalten). Hier ist die URL, über die Ely und ich eine Diskussion hatten: http://ffmpeg.gusari.org/viewtopic.php?f=11&t=2296&p=6652 Mark Gerolimatos vor 8 Jahren 0

0 Antworten auf die Frage