Quando si utilizza la modalità single-pass con una dimensione VBV specificata, libx264 inizialmente "sandbag" il bitrate, presumibilmente a causa della mancanza di prove (o forse anche di un bug). ( Questo è un ironico seguito a questa domanda, che si occupava di bitrate iniziali eccessivamente ALTI con codifica single-pass senza una specifica VBV )
Per ulteriori informazioni, consultare i grafici in bitrate in basso: notare il calo originale, seguito da una correzione eccessiva ("Ehi, mi sono rimasti alcuni bit!") Prima di una normalizzazione. Si noti che ciò è corretto nella soluzione a due passaggi. La mancanza del frame I iniziale in questi due grafici è probabilmente un bug dello strumento (il valore PTS del frame I iniziale è 0,15 secondi).
Questo effetto impedisce un'elaborazione parallela "suddivisa, codifica e riassembla" di un asset lungo, poiché all'inizio di ogni segmento otterrai un battito di qualità.
Questo può essere risolto tramite la codifica dual-pass, una soluzione inaccettabile per i flussi live (sebbene, se parallelizzati, si potrebbe pagare il costo della codifica dual pass).
Ci sono due soluzioni che spererei: qualsiasi assistenza sarebbe più che benvenuta.
Una soluzione a passaggio singolo in cui viene detto all'encoder di contenere inizialmente molti più frame prima di produrre output, riducendo così l'effetto sandbag iniziale
Un modo per eseguire la codifica a due passaggi limitata come "pipe": la codifica a due passaggi completa come pipe è ovviamente non sensata, ma dovrebbe essere possibile avere "micro pass" in cui il periodo di feedback del passaggio è qualcosa di simile a uno secondo. Questo è molto meno ideale di una soluzione a passaggio singolo per aggirare un effetto così breve, ma sarebbe accettabile se (1) fosse impossibile.
- Grafico bitrate Single Pass: notare il "tuffo di sabbia" iniziale. Generato con:
ffmpeg -i 1080-60fps.mp4 -vf "scale = 1200: 720" -b: v 1000k -bufsize 1000k onepass.mp4
- Grafico bitrate a due passaggi: questo è il risultato quasi ideale. Nota che questo modulo finale non è necessario: evitare il sandbag iniziale è sufficiente. Generato con:
ffmpeg -i 1080-60fps.mp4 -vf "scale = 1200: 720" -b: v 1000k -pass 1 -f mp4 / dev / null
ffmpeg -i 1080-60fps.mp4 -vf "scale = 1200: 720" -b: v 1000k -pass 2 twopass.mp4
- Sezione del primo frame nella codifica single pass
- Sezione del primo fotogramma nella codifica a due passaggi