Come creare un AVI non compresso da una serie di migliaia di immagini PNG usando FFMPEG


31

Come posso creare un AVI non compresso da una serie di migliaia di immagini PNG usando FFMPEG?

Ho usato questo comando per convertire un input.avifile in una serie di frame PNG:

ffmpeg -y -i input.avi  -an -vcodec png  -s 1024x768 pic%d.png`

Ora ho bisogno di sapere come realizzare un video AVI non compresso da tutti quei frame PNG. Ho provato questo:

ffmpeg -i pic%d.png -y -f avi -b 1150 -s 1024x768 -r 29.97 -g 12 -qmin 3 -qmax 13 -ab 224 -ar 44100 -ac 2 test.avi

Ma il video risultante perde molta qualità rispetto all'AVI originale.

Risposte:


77

Esistono diversi modi per ottenere un AVI "non compresso" ffmpeg, ma sospetto che in realtà tu voglia dire "senza perdita di dati". Entrambi i termini hanno un bel po 'di spazio nelle loro definizioni, come vedrai.

Ancorerò questa discussione con la versione HD a 720p di Big Buck Bunny , dal momento che è un video liberamente disponibile che tutti possiamo testare e ottenere risultati che possiamo confrontare. La velocità dati grezzi di video 1280 × 720p a 24 fps è quasi uguale a quella del tuo obiettivo dichiarato 1024 × 768 a 29,97 fps, quindi i miei risultati dovrebbero essere una guida abbastanza buona alle velocità dati che puoi aspettarti dal tuo filmato.

Elenco automatico delle opzioni disponibili

Il seguente comando POSIX¹ ti dà un elenco che per lo più² corrisponde a ciò che discutiamo di seguito:

$ ffmpeg -codecs 2> /dev/null | grep '^..EV..S ' | grep -vE 'bitmap|image'

Potresti voler eseguire quel comando sul tuo computer per vedere cosa supporterà la tua build di FFmpeg. FFmpeg è raramente realizzato con ogni possibile codificatore abilitato.

Ora parliamo di quelle opzioni.

Completamente non compresso

Se la tua definizione di "non compresso" è la forma il video è in diritto prima che sia rivolto a fotoni da un display digitale, il più vicino vedo nella ffmpeg -codecslista sono -c:v r210, r10k, v410, v308, ayuve v408. Questi sono tutti sostanzialmente la stessa cosa, differiscono solo per profondità di colore , spazio colore e alfa canale di supporto.

  • R210 e R10K sono 4: 4: 4 RGB a 10 bit per componente (bpc), in modo che entrambi richiedono circa 708 Mbit / s per 720p nel mio test. (Sono circa ⅓ TB all'ora, amici!)

    Questi codec racchiudono entrambi i componenti di colore 3 × 10 bit per pixel in un valore di 32 bit per facilitare la manipolazione da parte dei computer, che amano le dimensioni di potenza di 2. L'unica differenza tra questi codec è la fine della parola a 32 bit in cui si trovano i due bit inutilizzati. Questa banale differenza è senza dubbio perché provengono rispettivamente da aziende concorrenti, Blackmagic Design e AJA Video Systems .

    Sebbene si tratti di codec banali, probabilmente dovrai scaricare i codec Blackmagic e / o AJA per riprodurre i file utilizzandoli sul tuo computer. Entrambe le aziende vi permetterà di scaricare i loro codec senza aver comprato il loro hardware di prima, poiché sanno che si può avere a che fare con i file prodotti da clienti che fare avere alcuni dei loro hardware.

  • V410 è essenzialmente solo la versione YUV di R210 / R10K; le loro velocità di trasmissione dei dati sono identiche. Questo codec può tuttavia codificare più velocemente, poiché ffmpegè più probabile che abbia un percorso di conversione dello spazio colore accelerato tra lo spazio colore dei frame di input e questo spazio colore.

    Non posso raccomandare questo codec, tuttavia, poiché non sono stato in grado di riprodurre il file risultante in alcun software che ho provato, anche con i codec AJA e Blackmagic installati.

  • V308 è la variante a 8 bpc di V410, quindinel mio testarriva a 518 Mbit / s . Come con V410, non sono stato in grado di riprodurre questi file nel normale software di riproduzione video.

  • AYUV e V408 sono essenzialmente la stessa cosa di V308, tranne per il fatto che includono un canale alfa, che sia necessario o no! Se il tuo video non usa la trasparenza, ciò significa che paghi la penalità di dimensione dei codec R210 / R10K a 10 bpc sopra senza ottenere il vantaggio dello spazio colore più profondo.

    AYUV ha una sola virtù: è un codec "nativo" in Windows Media, quindi non richiede software speciali per giocare.

    V408 dovrebbe essere nativo di QuickTime allo stesso modo, ma il file V408 non potrebbe essere riprodotto in QuickTime 7 o 10 sul mio Mac.

Quindi, mettendo tutto insieme, se i tuoi PNG sono nominati frame0001.pnge così via:

$ ffmpeg -i frame%04d.png -c:v r10k output.mov
  ...or...                -c:v r210 output.mov
  ...or...                -c:v v410 output.mov
  ...or...                -c:v v408 output.mov
  ...or...                -c:v v308 output.mov
  ...or...                -c:v ayuv output.avi

Si noti che ho specificato AVI nel caso di AYUV, poiché è praticamente un codec solo per Windows. Gli altri potrebbero funzionare in QuickTime o AVI, a seconda dei codec presenti sul tuo computer. Se un formato contenitore non funziona, provare l'altro.

I comandi sopra - e anche quelli sotto - presumono che i tuoi frame di input abbiano già le stesse dimensioni che desideri per il tuo video di output. In caso contrario, aggiungi qualcosa di simile -s 1280x720al comando, prima del nome del file di output.

RGB compresso, ma anche senza perdite

Se, come sospetto, intendi effettivamente "senza perdita di dati" anziché "non compresso", una scelta molto migliore di una qualsiasi delle precedenti è Apple QuickTime Animation , tramite-c:v qtrle

So che hai detto che volevi un AVI, ma il fatto è che probabilmente dovrai installare un codec su un computer Windows per leggere uno dei formati di file basati su AVI menzionati qui, mentre con QuickTime c'è una possibilità che il video l'app di tua scelta sa già come aprire un file di animazione QuickTime. (Il codec AYUV sopra è l'unica eccezione di cui sono a conoscenza, ma la sua velocità di dati è terribilmente alta, solo per ottenere il vantaggio di AVI.)

ffmpegverrà qtrleinserito in un contenitore AVI per te, ma il risultato potrebbe non essere molto compatibile. Nei miei test, QuickTime Player si preoccuperà un po 'di questo file, ma lo riprodurrà. Stranamente, però, VLC non lo riprodurrà, anche se si basa in parte su ffmpeg. Attaccherei ai contenitori QT per questo codec.

Il codec di animazione QuickTime utilizza uno schema RLE banale , quindi per le animazioni semplici, dovrebbe fare così come Huffyuv di seguito. Più colori in ogni fotogramma, più si avvicinerà al bit rate delle opzioni completamente non compresse sopra. Nei miei test con Big Buck Bunny, sono stato in grado di ffmpegdarmi un file da 165 Mbit / s in modalità RGB 4: 4: 4, tramite -pix_fmt rgb24.

Sebbene questo formato sia compresso, fornirà valori di pixel di output identici ai file di input PNG, per lo stesso motivo per cui la compressione senza perdita di PNG non influisce sui valori di pixel.

L' ffmpegimplementazione di Animazione QuickTime supporta anche -pix_fmt argb, che ti dà 4: 4: 4: 4 RGB, il che significa che ha un canale alfa. In un modo molto approssimativo, è l'equivalente di QuickTime di -c:v ayuvcui sopra. A causa della compressione senza perdita, tuttavia, si arriva a soli 214 Mbit / s , meno di rate la velocità di trasmissione dati di AYUV senza perdita di qualità o funzionalità.

Esistono varianti di Animazione QuickTime con meno di 24 bit per pixel, ma sono utilizzate al meglio per stili di animazione progressivamente più semplici. ffmpegsembra supportare solo uno degli altri formati definiti dalla specifica -pix_fmt rgb555be, ovvero RGB big-endian da 15 bpp. È tollerabile per alcuni video e va bene per la maggior parte delle catture di screencast e animazioni semplici. Se riesci ad accettare la decimazione dello spazio colore, potresti trovare attraente la sua velocità dati di 122 Mbit / s .

Mettendo tutto questo insieme:

$ ffmpeg -i frame%04d.png -c:v qtrle -pix_fmt rgb24    output.mov
  ...or...                           -pix_fmt argb     output.mov
  ...or...                           -pix_fmt rgb555be output.mov

Senza perdite: il trucco YUV

Ora, la cosa su RGB e 4: 4: 4 YUV è che queste codifiche sono molto facili da elaborare per i computer, ma ignorano un fatto sulla visione umana, che è che i nostri occhi sono più sensibili alle differenze in bianco e nero rispetto alle differenze di colore .

I sistemi di archiviazione e consegna video quindi utilizzano quasi sempre meno bit per pixel per le informazioni sul colore che per le informazioni sulla luminanza. Questo si chiama chroma subsampling . Gli schemi più comuni sono 4: 2: 0 e 4: 2: 2.

La velocità dati di 4: 2: 0 YUV è solo del 50% superiore a quella per i video non compressi in bianco e nero (solo Y) e ½ la velocità dati di 4: 4: 4 RGB o YUV.

4: 2: 2 è una specie di punto a metà strada tra 4: 2: 0 e 4: 4: 4. È il doppio della velocità dati del video solo Y e ⅔ la velocità dati di 4: 4: 4.

A volte vedi anche 4: 1: 1, come nel vecchio standard della videocamera DV . 4: 1: 1 ha la stessa velocità dati non compressa di 4: 2: 0, ma le informazioni sul colore sono disposte in modo diverso.

Il punto di tutto ciò è che se stai iniziando con un file H.264 4: 2: 0, ricodificandolo in RGB non compresso 4: 4: 4 non avrai assolutamente nulla su YUV compresso senza perdita di 4: 2: 0. Questo è vero anche se sai che il tuo flusso di lavoro è altrimenti 4: 4: 4 RGB, poiché è una conversione banale; l'hardware e il software video eseguono tali conversioni al volo di routine.

Hai davvero bisogno di 4: 4: 4 quando fai capolino dai pixel o stai facendo cambiamenti di colore a livello di pixel sul video e devi preservare i valori esatti dei pixel. Il lavoro sugli effetti visivi (VFX) è più facile da svolgere con un formato di pixel 4: 4: 4, ad esempio, quindi le case VFX di fascia alta sono spesso disposte a tollerare le velocità di dati più elevate richieste.

Senza perdite: scelte di codec

Una volta che ti apri ai codec YUV con la decimazione dei colori, anche le tue opzioni si aprono. ffmpegha molti codec effettivamente senza perdita di dati .

Huffyuv

L'opzione più ampiamente compatibile è Huffyuv . Puoi ottenerlo tramite -c:v huffyuv.

Il codec Windows Huffyuv originale supporta solo due formati di pixel: RGB24 e YUV 4: 2: 2. (In realtà, supporta due versioni di YUV 4: 2: 2, che differiscono solo nell'ordine dei byte sul disco.)

Le versioni precedenti del codec FFmpeg Huffyuv non includevano il supporto RGB24, quindi se lo provi e FFmpeg ti dice che utilizzerà il yuv422pformato pixel, devi eseguire l'aggiornamento.

FFmpeg ha anche un codec variante Huffyuv chiamato FFVHuff, che supporta YUV 4: 2: 0. Questa variante non è compatibile con il codec Windows DirectShow Huffyuv, ma dovrebbe aprirsi in qualsiasi software basato su libavcodec, come VLC.

  • RGB24 - RGB 4: 4: 4 è essenzialmente la stessa cosa dell'opzione di spazio colore RGB24 di QuickTime Animation. I due codec differiranno leggermente nella compressione per un determinato file, ma saranno generalmente vicini.

    È essenzialmente la stessa cosa della modalità YUV 4: 4: 4 utilizzata dall'opzione V308 sopra. La differenza di spazio colore non fa alcuna differenza pratica, poiché la conversione dello spazio colore è facile da eseguire in tempo reale.

    Grazie alla compressione senza perdita di Huffyuv, sono stato in grado di ottenere un video di prova da comprimere a circa 251 Mbit / s in modalità RGB24, con identica qualità visiva a quella che otterresti da V308 o AYUV. Se AVI è un must assoluto per te, l'installazione del codec Huffyuv è probabilmente meno dolorosa del pagamento del costo della velocità dati 3 × di AYUV.

  • YUV 4: 2: 2 - Questa modalità è molto più pratica per i video rispetto a RGB24, il che è senza dubbio il motivo per cui gli ffmpegsviluppatori hanno scelto di implementarla per prima. Come ci si aspetterebbe dalla riduzione teorica discussed discussa sopra, il mio file di test codificato a 173 Mbit / s . È praticamente esattamente ⅔, se si tiene conto del fatto che la traccia audio è rimasta invariata tra questi due test.

  • YUV 4: 2: 0 : questa opzione consente di decimare le informazioni sul colore più di 4: 2: 2, riducendo la velocità dei dati a 133 Mbit / s nei miei test.

Mettendo tutto questo insieme:

$ ffmpeg -i frame%04d.png -c:v huffyuv -pix_fmt rgb24   output.avi
  ...or...                             -pix_fmt yuv422p output.avi
  ...or...                -c:v ffvhuff -pix_fmt yuv420p output.avi

Anche se il ffvhuffcodec viene impostato automaticamente su 4: 2: 0 mentre scrivo questo, e in effetti supporta solo quel formato di pixel nella versione di rilascio che sto usando, questo sta cambiando , quindi dovresti includere il flag nel caso in cui questa impostazione predefinita cambi.

Ut Video

Un'opzione più recente nello stesso spirito di Huffyuv e FFVHuff è Ut Video . Come Huffyuv, esiste un codec video Windows che significa che qualsiasi programma Windows in grado di riprodurre un film può riprodurre video utilizzando questo codec con il codec installato. A differenza di Huffyuv, esiste anche un codec video per Mac, quindi non sei limitato al software basato su FFmpeg o libavcodecper leggere questi file su Mac.

Questo codec è molto flessibile in termini di spazi colore, quindi fornirò solo alcuni esempi di spazi colore comuni:

  • 4: 4: 4 RGB via -f avi -c:v utvideo -pix_fmt rgb24fornisce un'uscita di 178 Mbit / sec

  • 4: 4: 4 YUV via -f avi -c:v utvideo -pix_fmt yuv444pfornisce un'uscita di 153 Mbit / sec

  • 4: 2: 2 YUV tramite -f avi -c:v utvideo -pix_fmt yuv422pfornisce output a 123 Mbit / sec

  • 4: 2: 0 YUV via -f avi -c:v utvideo -pix_fmt yuv420pfornisce un'uscita di 100 Mbit / sec

Sospetto che 4: 4: 4 YUV faccia meglio di 4: 4: 4 RGB in questo test nonostante questi due siano tecnicamente equivalenti perché il video sorgente è 4: 2: 0 YUV, quindi organizzare i dati in formato YUV consente una migliore compressione senza perdita di dati raggruppando i canali U e V parzialmente ridondanti nel file.

FF video codec 1

Un'altra opzione interessante in questo spazio è proprio FFmpeg FFV1codec . Questo è principalmente usato come un codec di archiviazione piuttosto che un codec di riproduzione o modifica, ma poiché così tanto software è basato sulla libavcodeclibreria alla base di FFmpeg o può essere attaccato libavcodectramite strumenti come ffdshow, può esserti utile comunque.

Per impostazione predefinita, ffmpegmanterrai lo spazio colore dei tuoi file di input quando utilizzi un codec flessibile come FFV1, in modo che se lo carichi uno dei file MP4 Big Buck Bunny ufficiali, che utilizzano 4: 2: 0 YUV, ecco cosa otterrai a meno che tu non dia una -pix_fmtbandiera a ffmpeg. Ciò si traduce in un file di output a 63 Mbit / s .

Se imponi a FFV1 di utilizzare uno spazio colore YUV 4: 4: 4 -pix_fmt yuv444p, la dimensione del file sale solo a 86 Mbit / sec , ma in questo caso non ci sta acquistando nulla poiché stiamo codificando da un originale 4: 2: 0 . Tuttavia, se si inserisce invece un set di PNG, come nella domanda originale, è probabile che il file di output utilizzi lo spazio colore bgrao bgr0, che sono solo riarrangiamenti degli spazi colore argbe rgb24indicati in precedenza.

H.264 senza perdite

Un'altra alternativa interessante è Lossless H.264 . Questa è praticamente una cosa solo x264 al momento della stesura di questo documento, ma quelli che usano FFmpeg sul lato della codifica probabilmente useranno altri software che includono anche libx264sul lato della decodifica , come VLC.

Il modo più semplice per ottenere un tale file è:

$ ffmpeg -i frame%04d.png -c:v libx264 -qp 0 -f mp4 output.mp4

La -qp 0bandiera è la chiave: valori più alti danno una compressione con perdita. (Puoi anche dare -crf 0per ottenere lo stesso effetto.)

Come con FFV1, ffmpegproverò a indovinare il miglior spazio colore di output dato lo spazio colore di input, quindi per confronto con i risultati sopra, ho eseguito più passaggi di codifica sul file sorgente Big Buck Bunny con diversi spazi colore:

  • yuv444p : Questo è ciò che ffmpegsceglie quando gli dai un flusso PNG RGB, come nella domanda originale, e genera un file 44 Mbit / sec con il nostro file di test

  • yuv422p : Questo è simile allo spazio colore predefinito per Huffyuv, ma in questo caso otteniamo un file da 34 Mbit / sec , un bel risparmio!

  • yuv420p : questa è l'impostazione predefinita per gli MP4 ufficiali di Big Buck Bunny con cui sto testando e genera un file di 29 Mbit / sec .

Ricorda che stai commerciando molta compatibilità per ottenere file di dimensioni così ridotte. Ecco perché non mi sono nemmeno preoccupato di riporlo in un contenitore AVI o MOV. È così strettamente legato a x264 che potresti anche usare il suo tipo di contenitore standard (MP4). Puoi anche usare qualcosa come Matroska per questo.

Puoi aggiungere un po 'di quel bit rate per un tempo di codifica più veloce aggiungendo -preset ultrafast. Ciò ha aumentato il bit rate del mio file di test a 44 Mbit / s in modalità YUV 4: 2: 2, ma è stato codificato molto più velocemente, come promesso. I documenti sostengono che -preset veryslowvale anche la pena, ma ha comportato un tempo di codifica molto più lungo risparmiando solo un po 'di spazio; Non posso raccomandarlo.

Altri

ffmpegsupporta anche la modalità di sola decodifica per Lagarith e la modalità di sola codifica per Lossless JPEG . Questi due codec sono in realtà un po 'simili e dovrebbero dare file un po' più piccoli di Huffyuv con la stessa qualità. Se gli ffmpegsviluppatori aggiungessero mai la codifica Lagarith, sarebbe una forte alternativa a Huffyuv. Non posso raccomandare Lossless JPEG, tuttavia, poiché non gode di un ampio supporto di decodifica.

Percettivamente senza perdita: o, probabilmente, puoi cavartela con qualche perdita

Poi ci sono i codec che sono percettivamente senza perdita. A meno che tu non stia sbirciando i pixel, quasi sicuramente non puoi dire che questi danno risultati visivi diversi rispetto ai due precedenti gruppi. Rinunciando all'idea di un cambiamento assolutamente nullo tra il sensore di acquisizione video e il dispositivo di visualizzazione, si acquista un notevole risparmio:

  • Apple ProRes :-c:v proresoppure-c:v prores_ks- ProRes è un codec basato sul profilo, il che significa che ci sono diverse varianti, ognuna con una qualità diversa rispetto allo spazio:

    • ProRes 4444 codifica il nostro video di prova usando solo 114 Mbit / s , ma è di qualità VFX . Attualmente ci sono tre diversiprores*codec in FFmpeg, maprores_kssupportasoloProRes 4444, mentre scrivo questo, tramite l'-profile:v 4444opzione.

      Se ti stai chiedendo perché dovresti preoccuparti di utilizzare ProRes 4444 su Lossless H.264, si tratta di compatibilità, velocità di decodifica, prevedibilità e canale alfa.

    • ProRes 422 consente di risparmiare ancora più spazio, richiedendo solo 84 Mbit / s per dare un risultato che si può dire da ProRes 4444 solo facendo capolino dai pixel. A meno che non sia necessario il canale alfa offerto da ProRes 4444, probabilmente non c'è motivo di insistere su ProRes 4444.

      ProRes 422 è un concorrente più vicino all'opzione Lossless H.264 di cui sopra, poiché nessuno dei due supporta un canale alfa. Ti consigliamo di tollerare la velocità in bit più elevata di ProRes se hai bisogno di compatibilità con le app video professionali Apple, un sovraccarico della CPU inferiore per la codifica e decodifica o velocità in bit prevedibili. Quest'ultimo è importante con gli encoder hardware, ad esempio. D'altra parte, se riesci a far fronte ai problemi di compatibilità di Lossless H.264, avrai la possibilità di utilizzare lo spazio colore 4: 2: 0, che non è un'opzione da nessun profilo ProRes.

      Tutti e tre gli encoder ProRes in FFmpeg supportano il profilo ProRes 422, quindi l'opzione più semplice è quella di utilizzare -c:v prores, piuttosto che -c:v prores_ks -profile hq, o dipendere dalla funzione di profilo automatico prores_ksper fare la cosa giusta.

    Esistono profili ProRes ancora più parsimoniosi, ma sono pensati per video SD o come proxy per file a risoluzione piena.

    Il problema principale con ProRes è che non ha ancora un ampio supporto al di fuori dei mondi video Apple e Pro.

  • Il DNxHD di Avid è un codec simile a ProRes, ma non è legato al mondo dei video pro di Apple. Avid offre codec scaricabili liberamente per Windows e Macintosh e FFmpeg ora lo supporta tramite-c:v dnxhd.

    Poiché DNxHD è un codec basato su profilo come ProRes, si sceglie il profilo dall'insieme predefinito e indica al codec quali dimensioni, frequenza e bit rate del frame usare. Per il file di test di Big Buck Bunny, il -b:v 60Mprofilo è più appropriato. Non sorprende che il file risultante sia di circa 59 Mbit / s .

  • MJPEG a bassa perdita :-vcodec mjpeg -qscale:v 1- Questo è molto più comune del JPEG senza perdita di dati. In realtà, questo era un tempo un codec di editing video abbastanza comune, ed è ancora spesso usato da cose come videocamere di streaming in rete. Tutta quella storia significa che è facile trovare software che la supporti.

    Aspettati una variabilità piuttosto ampia delle velocità dei dati da questo codec. Un test che ho appena fatto qui mi ha dato 25 Mbit / s per video a 720p. È una compressione abbastanza alta da rendermi nervoso per la perdita, ma mi è sembrato abbastanza buono. Basandomi solo sulla velocità dei dati, direi che è probabilmente alla pari della qualità a 12 Mbit / s MPEG-2 o 6 Mbit / s H.264.

Mettendo tutto questo insieme:

$ ffmpeg -i frame%04d.png -c:v prores_ks -profile:v 4444 output.mov
  ...or...                -c:v prores_ks -profile:v hq   output.mov
  ...or...                -c:v prores                    output.mov
  ...or...                -c:v dnxhd -b:v 60M            output.mov
  ...or...                -c:v mjpeg -qscale:v 1         output.avi

La linea di fondo su questi metodi è che a meno che tu non stia facendo qualcosa di molto impegnativo, "abbastanza buono" è davvero abbastanza buono.


Note a piè di pagina e digressioni

  1. Il comando dovrebbe funzionare come indicato su Linux, macOS, BSD e Unix. Se sei su Windows, puoi ottenere una riga di comando POSIX tramite Cygwin o WSL .

  2. Esistono diversi motivi per cui l'elenco prodotto da quel comando non corrisponde perfettamente all'insieme di codec che ho scelto di discutere sopra:

    • Il secondo ha lo grepscopo di filtrare codificatori inappropriati come quelli bmpche non sono codec "video", nonostante siano stati taggati Vin questo elenco. Anche se tecnicamente potresti probabilmente mettere molti di questi in un contenitore come AVI, MP4 o MKV per ottenere un video a file singolo, quel file probabilmente non sarà leggibile da nulla se non da un programma basato su ffmpego libavcodec.

      Ci sono alcune eccezioni a questo, come quella che -f avi -c:v ljpegdà qualcosa che potresti chiamare "Lossless MJPEG", ma di regola non siamo interessati a mettere qui molti file di immagini fisse in un contenitore A / V per fare un film. Vogliamo codec video ampiamente riconosciuti qui, non inganno semantico.

    • Il comando attualmente non riesce a filtrare alcuni codificatori inappropriati come GIF perché non sono attualmente descritti ffmpeg -codecsnell'output come bitmapo nei imageformati di file.

      La GIF è un caso interessante: supporta più frame di immagini in un singolo file GIF con informazioni di temporizzazione per la riproduzione in movimento, ma per diversi motivi, è del tutto inappropriato alla nostra discussione qui.

    • Alcune delle opzioni che vengono visualizzati sono obsoleti o mai veramente avuto molta trazione, come ad esempio flashsv, dirace snow, quindi non vale la pena discuterne sopra.

    • Alcune delle opzioni in quell'elenco sono pensate solo per l'uso in pipeline tra ffmpegistanze o tra ffmpegun altro programma, come rawvideoe wrapped_avframe, e quindi non sono appropriate per i nostri scopi qui.

    • Verso la fine della discussione di cui sopra, esplogo con giudizio un po 'l'ambito della domanda per includere alcune opzioni con perdita selezionate con cura, in modo che non passino il primo grepfiltro nel comando sopra.


1
Dopo aver provato molti, molti formati non compressi / lossless per trovare uno che After Effects avrebbe importato, il tuo Quicktime finalmente lo ha fatto. Per riferimento è stato ffmpeg -i input.avi -c:v qtrle -pix_fmt rgb24 output.mov.
felwithe il

9

Così ho finito per rendere la mia risposta troppo a lungo.
Riepilogo TL; DR: per la memorizzazione senza perdita di una sequenza di immagini, utilizzare libx264o libx264rgbcon -preset ultrafast -qp 0. È quasi veloce come ffvhuff, con bitrate molto più basso e decodifica più velocemente. huffyuvè molto più ampiamente supportato al di fuori di ffmpeg, ma non supporta tanti formati di pixel quanti ffvhuff. Quindi questo è un altro motivo per usare h.264, supponendo che gli altri tuoi strumenti possano gestire il High 4:4:4 Predictiveprofilo h.264 che x264 usa in modalità lossless. x264 può essere intra-solo se è necessario un rapido accesso casuale a frame arbitrari.

Fai attenzione a un bug di ffmpeg che influenza libx264rgb durante la lettura da una directory di immagini. (e chissà quali altri casi.) Verifica l'assenza di perdite nella tua configurazione prima dell'uso. (facile con ffmpeg -i in -pix_fmt rgb24 -f framemd5sorgente e senza perdita di compressione))

modifica: utvideocodifica e decodifica abbastanza velocemente ed è un codec molto più semplice di h.264. È fondamentalmente un moderno huffyuv, con supporto per spazi colore più utili. Se hai mai avuto problemi con h.264, prova utvideo successivo per i file temporanei.

edit2: PNG come codec RGB sembra funzionare bene, almeno sul trailer di Sintel.

Vedi anche la mia risposta simile a una domanda simile: https://superuser.com/a/860335/20798

Ci sono molte informazioni nella risposta di Warren Young su vari formati e codec grezzi. Penso che la risposta sarebbe più utile se fosse più breve, quindi sto facendo una nuova risposta. Se stai lavorando con un software che non supporta x264 lossless o ffvhuff, alcune di queste informazioni sono probabilmente ancora utili.

La definizione più utile di "lossless" in questo contesto è che è possibile ripristinare l'input bit per bit. Nessuna preoccupazione per il degrado della qualità dovuto alla codifica video, indipendentemente da ciò che fai.

http://en.wikipedia.org/wiki/Chroma_subsampling

Idealmente, evita più conversioni di spazio colore. Gli errori di arrotondamento possono potenzialmente accumularsi. Se hai intenzione di operare sul tuo video con filtri che funzionano nello spazio dei colori RGB, allora mantenerlo RGB ha senso, a condizione che i bitrate più alti non siano un problema. Probabilmente alla fine producerai un yuv 4:2:0video, ma mantenere la risoluzione extra di crominanza è potenzialmente utile, a seconda dei filtri che intendi applicare.

In entrambi i casi, x264 lossless e ffvhuff sia il supporto RGB e YUV 4:4:4, 4:2:2e 4:2:0. Suggerirei x264, poiché è veloce da decodificare. Se stai provando a riprodurre video RGB HD in tempo reale, prova opengl invece di xv, poiché xv sul mio sistema accetta solo input yuv. mplayer impiegava molto tempo in più per eseguire una conversione dello spazio colore.

Fonte per i seguenti test dell'encoder: https://media.xiph.org/ . https://media.xiph.org/sintel/sintel_trailer-1080-png.tar.gz Si sono dimenticati di gzip i file y4m per il trailer di sintel, quindi il tarball png è in realtà molto più piccolo.

ffmpeg -i 1080/sintel_trailer_2k_%4d.png -i sintel_trailer-audio.flac \
-c:a copy -c:v libx264rgb -preset ultrafast -qp 0 \
frompng.sintel.264rgb.mkv

per esempio

peter@tesla:/mnt/GP1TB/p/encoder-sample/sintel$ time ffmpeg -i 1080/sintel_trailer_2k_%4d.png -i sintel_trailer-audio.flac -c:a copy -c:v libx264rgb -preset ultrafast -qp 0 frompng.sintel.264rgb.mkv
ffmpeg version N-67983-g2b358b4 Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan 10 2015 05:32:37 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --enable-gpl --enable-version3 --enable-nonfree --disable-doc --disable-ffserver --enable-libx264 --enable-libx265 --enable-libmp3lame --enable-libopus --enable-libwebp --enable-libvpx --disable-outdev=oss --disable-indev=oss --disable-encoder=vorbis --enable-libvorbis --enable-libfdk-aac --disable-encoder=aac --disable-decoder=jpeg2000
  libavutil      54. 16.100 / 54. 16.100
  libavcodec     56. 20.100 / 56. 20.100
  libavformat    56. 18.100 / 56. 18.100
  libavdevice    56.  3.100 / 56.  3.100
  libavfilter     5.  7.100 /  5.  7.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, image2, from '1080/sintel_trailer_2k_%4d.png':
  Duration: 00:00:50.12, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 1920x1080 [SAR 72:72 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Input #1, flac, from 'sintel_trailer-audio.flac':
  Duration: 00:00:52.00, start: 0.000000, bitrate: 721 kb/s
    Stream #1:0: Audio: flac, 48000 Hz, stereo, s16
File 'frompng.sintel.264rgb.mkv' already exists. Overwrite ? [y/N] y
No pixel format specified, rgb24 for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264rgb @ 0x2770760] using SAR=1/1
[libx264rgb @ 0x2770760] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264rgb @ 0x2770760] profile High 4:4:4 Predictive, level 4.0, 4:4:4 8-bit
[libx264rgb @ 0x2770760] 264 - core 144 r2525+2 6a4fca8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=0 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, matroska, to 'frompng.sintel.264rgb.mkv':
  Metadata:
    encoder         : Lavf56.18.100
    Stream #0:0: Video: h264 (libx264rgb) (H264 / 0x34363248), rgb24, 1920x1080 [SAR 72:72 DAR 16:9], q=-1--1, 25 fps, 1k tbn, 25 tbc
    Metadata:
      encoder         : Lavc56.20.100 libx264rgb
    Stream #0:1: Audio: flac ([172][241][0][0] / 0xF1AC), 48000 Hz, stereo (16 bit)
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> h264 (libx264rgb))
  Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 1253 fps= 18 q=-1.0 Lsize=  834790kB time=00:00:51.96 bitrate=131592.5kbits/s
video:830198kB audio:4575kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.002025%
[libx264rgb @ 0x2770760] frame I:6     Avg QP: 0.00  size:612470
[libx264rgb @ 0x2770760] frame P:1247  Avg QP: 0.00  size:678787
[libx264rgb @ 0x2770760] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264rgb @ 0x2770760] mb P  I16..4: 50.3%  0.0%  0.0%  P16..4: 12.0%  0.0%  0.0%  0.0%  0.0%    skip:37.6%
[libx264rgb @ 0x2770760] coded y,u,v intra: 71.1% 68.2% 70.0% inter: 22.8% 22.8% 23.2%
[libx264rgb @ 0x2770760] i16 v,h,dc,p: 50% 48%  1%  1%
[libx264rgb @ 0x2770760] kb/s:135693.94

Nota che ho dimenticato di specificare -r 24fps, quindi non manterrà la sincronizzazione av con l'audio. (e anche i numeri di bitrate (ma non le dimensioni del file) saranno disattivati. ffmpeg viene impostato automaticamente su 25fps). La CPU di questa macchina è un core2duo 2.4GHz (E6600) di prima generazione (conroe).

i risultati:

4.5M    sintel_trailer-audio.flac  # this is muxed in to every mkv
948M    1080  # the directory of PNGs
940M    /var/tmp/dl/sintel_trailer-1080-png.tar.gz
7434M   sintel.y4m  # yuv444, uncompressed.  mplayer gets the colors wrong?
2342M   qtrle.mkv   # encode went at 16fps, so qtrle is slower and worse filesize
2105M   sintel.huff.mkv  # ffvhuff with default options, rgb pix fmt
1228M    sintel.utvideo.mkv  # muxed without audio, I should update the others this way
946M    png-copy.mkv  # -codec copy makes a MPNG stream.  Use -codec png for non-png sources, but it won't make PNGs as small.  Decodes very fast
824M    lossy.prores_ks.mov # yuv444p10le extremely slow to encode (2.3fps), and worse bitrate.
816M    frompng.sintel.264rgb.mkv
735M    sintel.x264rgb.medium.nocabac.mkv  # encode went at 3.3 fps instead of 18.  Better gain than for live-action, though
626M    sintel_trailer.rgb.lossless.veryslow.mkv # 1.1fps.  With CABAC, 16 ref frames, etc. etc.
512M    lossy.prores.mov # yuv422p10le, 12fps
341M    sintel.yuv420.x264.lossless.mkv
21M     lossy.rgb.crf26.preset=medium.mkv
13M     lossy.yuv420.crf26.preset=medium.mkv  # remember this is WITH 4.5MB audio

Nota che mediainfonon conosce RGB h.264, dice ancora che i file sono YUV.

Verifica che sia davvero senza perdita di dati:

ffmpeg -i 1080/sintel_trailer_2k_%4d.png -f framemd5 png.framemd5
ffmpeg -i fromhuff.sintel.264rgb.mkv -an -sn -pix_fmt rgb24  -f framemd5 x264rgb.framemd5
diff -s *.framemd5
Files png.framemd5 and x264rgb.framemd5 are identical

In questo modo è possibile ripristinare l'input PNG originale in questo modo, ovvero è possibile creare PNG con dati immagine identici in essi contenuti.

Nota -pix_fmt rgb24per il test x264. Il decodificatore h.264 di ffmpeg emette output gbrp (planare, non compresso), quindi i bit sono uguali, ma in un ordine diverso. Il "contenitore" framemd5 non impone alcun tipo di restrizioni di formato, ma otterrai lo stesso md5 solo se i bit sono disposti allo stesso modo. Ho appena guardato quello che ffmpeg ha detto che stava usando per un pix fmt quando l'ho alimentato con i PNG, poi l'ho usato come argomento -pix_fmtper la decodifica. Per inciso, questo è il motivo per cui vlc non riproduce i file RGB h.264 (fino alla prossima versione o build notturne correnti): non supporta il formato pixel gbrp.

Per l'uso yuv libx264, no libx264rgb. Non è necessario installare una versione RGB di x264, la libreria effettiva supporta entrambi. È solo ffmpeg che lo ha implementato come due encoder con nomi diversi. Penso che se non lo avessero fatto, il comportamento predefinito sarebbe quello di lasciare l'input rgb come rgb ed eseguire molto lentamente producendo output bitrate molto più alti per la stessa qualità. (a volte è ancora necessario utilizzare -pix_fmt yuv420pse si desidera 420invece l' 444output h.264.

A meno che non si creino file per l'archiviazione a lungo termine, utilizzare sempre -preset ultrafastper x264 senza perdita di dati. Più frame di riferimento e ricerca del movimento fanno a malapena la differenza per il materiale lossless, per il materiale non animato e privo di rumore. CABAC richiede un'enorme quantità di CPU a bitrate senza perdita di dati, anche per la decodifica. Utilizzare solo a scopo di archiviazione, non i file di memoria virtuale. (ultraveloce disabilita CABAC). CABAC offre un risparmio del bitrate dal 10 al 15%.

Se è necessario che ogni fotogramma sia un fotogramma chiave, impostare -keyint 1. Quindi il software di editing video che vuole solo tagliare fotogrammi chiave o w / e non ti limiterà.

Per rispondere alla domanda originale: questo è ciò che dovresti fare per lanciare file temporanei mentre provi le cose in più fasi (ad esempio un deinterlacciamento lento, salvando l'output senza perdita di dati prima di provare altre cose):

ffmpeg -i dv-video-source.ts -vf yadif=2:1,mcdeint=3:1:10 -c:a copy -c:v libx264 -preset ultrafast -qp 0 deinterlaced.mkv

Se hai davvero bisogno del tuo output in file di immagine che puoi modificare con strumenti di immagini fisse, allora decodificalo in png. Non perderai nulla di più che forse il meno significativo degli 8 bit di per ciascuno dei valori Y, Cb e Cr per ciascun pixel.

x264 esce davvero bene in questo perché ci sono molte cornici nere con un po 'di testo, una dissolvenza in entrata e in uscita e una perfetta somiglianza tra grandi aree di molte cornici, di cui riesce a trarre vantaggio anche con -preset ultrafast. Su live-action, vedo ancora x264 a metà della dimensione del file di ffvhuff (yuv420).

Per chiunque sia curioso: la codifica rgb lossless ad alta cpu aveva (x264 core 144 r2525):

[libx264rgb @ 0x35b97a0] frame I:27    Avg QP: 0.00  size:604367
[libx264rgb @ 0x35b97a0] frame P:1226  Avg QP: 0.00  size:517512
[libx264rgb @ 0x35b97a0] mb I  I16..4..PCM: 46.3% 38.1% 15.7%  0.0%
[libx264rgb @ 0x35b97a0] mb P  I16..4..PCM: 24.3%  5.4%  4.5%  0.0%  P16..4: 10.5%  3.3%  5.7%  0.0%  0.0%    skip:46.3%
[libx264rgb @ 0x35b97a0] 8x8 transform intra:17.3% inter:46.1%
[libx264rgb @ 0x35b97a0] coded y,u,v intra: 81.6% 77.5% 80.0% inter: 28.0% 27.7% 28.1%
[libx264rgb @ 0x35b97a0] i16 v,h,dc,p: 35% 64%  1%  0%
[libx264rgb @ 0x35b97a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 49% 13%  2%  1%  1%  1%  1%  1%
[libx264rgb @ 0x35b97a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 37%  5%  5%  6%  5%  5%  4%  3%
[libx264rgb @ 0x35b97a0] Weighted P-Frames: Y:41.1% UV:40.7%
[libx264rgb @ 0x35b97a0] ref P L0: 74.5%  4.2%  9.1%  4.1%  2.1%  1.7%  1.2%  0.8%  0.6%  0.5%  0.3%  0.2%  0.2%  0.2%  0.2%  0.1%
[libx264rgb @ 0x35b97a0] kb/s:99721.66

Notare la frazione molto elevata di fotogrammi p ponderati e anche la frazione molto elevata di saltare i macroblocchi. Ogni transizione di scena è una dissolvenza, non un taglio, e x264 ne approfitta se gli dai il tempo della CPU per capire come.

ulteriori note (codec con perdita di dati per l'editing):

Per scorrere in avanti / indietro tra le clip, i codec intra-only sono generalmente preferiti (utvideo, ffvhuff, mjpeg, jpeg2000, pro-res, AVC-Intra). Immagino che anche un normale AVC con GOP brevi (da 1/2 a 1 secondo) scrub abbastanza bene, purché il software sapesse cosa stava facendo (decodifica il fotogramma più vicino a me durante lo scrubbing veloce, decodifica all'interno del GOP per arrivare a un fotogramma inter se hai ingrandito abbastanza su una sequenza temporale per renderlo necessario).

Ho pubblicato alcune cose negative su questo e https://video.stackexchange.com/ su pro-res, come "qual è il punto se è una compressione più lenta e peggiore di un codec senza perdita", ma ha alcune caratteristiche interessanti. Apple afferma che può decodificare a metà risoluzione utilizzando solo 1/3 del tempo di CPU per la decodifica del rez completo.

L'implementazione dei prores di ffmpeg non è probabilmente ottimizzata per la velocità come quella di Apple, motivo per cui i miei test con ffmpeg lo hanno fatto sembrare lento. Probabilmente non vale la pena utilizzarlo se si dispone di un flusso di lavoro del software libero con strumenti basati su ffmpeg, ma potrebbe valere la pena provare se si utilizza un software commerciale.

Non faccio molto editing video, principalmente solo codifica, quindi non ho una buona idea di quali test sarebbero appropriati per i codec come i prori. Immagino che forse mjpeg sarebbe una buona alternativa veloce, se short-GOP x264 non funziona bene. Ci sono implementazioni asp accelerate di jpeg nelle distribuzioni Linux, ed è un codec piuttosto semplice. È possibile aumentare o diminuire la qualità in base alle esigenze per compromettere la qualità rispetto alla dimensione del file + codificare / decodificare la velocità. È antico, ma se vuoi un codec intra-only che è davvero veloce, potrebbe battere x264.

Per x264, proverei qualcosa di simile x264 --crf 10 --keyint=1 --preset superfast --tune fastdecode (solo Intra, senza nessuna delle altre cose che --avcintra-classimposta). Nota superfast(senza CABAC), o faster, ultrafastprobabilmente , non è meglio per operazioni con perdita di dati. Penso che l'ultraveloce perda molta qualità senza essere molto più veloce. Più bassa è la qualità (più elevato crf) che usi, più vale la pena dedicare un po 'più tempo alla CPU per trovare una codifica migliore. Molto probabilmente non è rilevante con GOP size = 1, comunque.

Con dimensioni GOP> 1, se stai lanciando così tanti bit nella codifica che una migliore predizione non risparmierà molti bit durante la codifica dei residui (perché i cambiamenti di rumore / grana / sottili tra i frame vengono conservati in modo molto accurato), quindi solo il superveloce probabilmente va bene. Altrimenti, con --keyint=30o qualcosa del genere, probabilmente --preset veryfast --crf 12sarebbe interessante.

In teoria, la qualità in una determinata impostazione CRF dovrebbe essere costante tra i preset. Se stai cercando file più piccoli (decodifiche più veloci), ha senso scambiare qualità e tempo di codifica.


Volevo solo dire grazie per quell'elenco con le dimensioni del file; grandi cose per una rapida consultazione .. Saluti!
sdaau,

@sdaau Nota che il video sorgente è MOLTO diverso dai video tipici realizzati con le telecamere. È un rendering 3D, con letterbox e con molte sfumature tra le scene brevi. E una discreta frazione di cornici totalmente fisse con testo. I frame totalmente fissi sono tutti abbastanza compressi, ma favorisce comunque i codec con i frame inter (come x264) più di quanto immaginerei la compressione senza perdita di filmati della telecamera (con qualsiasi rumore).
Peter Cordes,

+1: Non avevo idea che Lossless H.264 fosse persino una cosa. Ho aggiunto informazioni al riguardo alla mia risposta. Sentitevi liberi di prendere alcune idee da mia presentazione più breve per risolvere il tl; dr problema. Per quanto riguarda la mia risposta, è pensato per essere completo, piuttosto che cercare di presentare la vera soluzione al problema. Abbiamo così tanti codec diversi perché nessun codec singolo soddisfa le esigenze di tutti.
Warren Young

2

Penso che ffmpeg in realtà supporti la conversione in video non compresso.
Ho usato ffmpeg -i input.mp4 -vcodec rawvideo out.avi e il risultante .avi era approssimativamente la dimensione giusta del file. Windows Media Player non sembrava essere in grado di riprodurlo correttamente, ma poteva essere letto da VirtualDub e non ho riscontrato alcuna perdita nella qualità delle immagini.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.