Come creare un file video MPEG2 con la massima qualità possibile usando FFMPEG?


12

Ho un file WMV (v9 (WMV3), 960x720, 30.000030 fps, planare 4: 2: 0 YUV, prodotto da PowerPoint 2010) e devo convertirlo in MPEG2 - l'unico formato che il mio televisore può leggere da un'unità flash USB (Ho anche provato MP4 / h.264, AVI / XVID - nient'altro che MPEG2 funziona).

Sono riuscito a fare il lavoro con semplicità

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"

ma la qualità del risultato è terribile (vengono introdotte distorsioni visive chiaramente visibili) e la riproduzione non è fluida (troppo lenta in alcuni momenti).

Ho anche provato

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"

(Ho trovato questo da qualche parte in Internet e modificato un po '- ha cambiato il resoultion, la frequenza di aggiornamento e il formato di output (da VOB a MPG nudo)) con successo ma la qualità è ancora troppo male.

Quali parametri devo usare per salvare la massima qualità possibile? Il rapporto di compressione non ha alcuna importanza, anche l'aumento delle dimensioni del file è accettabile.

Un'altra cosa di cui ho davvero bisogno (ho scelto di non includerla nel titolo della domanda per evitare di renderla troppo specifica ma apprezzerei che venga considerata nelle risposte) è l'aggiunta del puro silenzio come traccia audio - non c'è suono nel originale ma il televisore si lamenta e mi piacerebbe sbarazzarmi di questo lamentoso. Ho generato un file OGG Vorbis di silenzio della stessa lunghezza (secondo preciso) usando Audacity ma non riesco a fonderlo con il video:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

e anche nudo

ffmpeg -i in.mpg -c:v copy -out.mpg

fornisce errori "buffer underflow" e "packet too large". (in.mpg sono i file prodotti dallo stesso binario FFMPEG e lo stesso file WMV sorgente utilizzando i primi due comandi nella domanda).

Sto usando una build Zeranoe FFMPEG su Windows 7.


1
Qualcuno ti chiederà un log di output completo.
dstob

Che TV è esattamente? Potrebbe essere in grado di leggere H.264, solo un profilo diverso.
slhck

@ slhck Il televisore è Philips 42PFL3606H/58, Sto codificando per H.264 con ffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4" - il profilo è il più basso che io conosca e vengono utilizzati ancora più ritocchi per rendere più semplice la riproduzione del file risultante.
Ivan

1
Secondo il manuale, il televisore supporta MPEG-4 Visual e H.264. Se il profilo di riferimento non funziona, non sono sicuro di cosa sia. Ma i televisori sono molto esigenti.
slhck

Risposte:


11

Il problema è che il bitrate predefinito per MPEG-2 è piuttosto basso (come con la maggior parte degli altri codificatori video in ffmpeg, essendo l'eccezione H.264 un'eccezione). Attualmente MPEG-2 non è la scelta migliore come codec.

Migliore qualità per MPEG-2

Hai alcune opzioni se vuoi rimanere con MPEG-2:

  • Aumentare il bitrate. Ora stai usando -b:v 2500k. Se si tratta di video HD, non andrai lontano con solo 2,5 MBit / s. Hai bisogno di almeno il doppio o anche di più per rendere il risultato un bell'aspetto. Ad esempio, usa -b:v 6000k -target pal-dvd.

    Per 720p, penso che dovresti ancora utilizzare un bitrate più alto. Ricorda che i DVD utilizzano MPEG-2 e arrivano a circa 4,7 GB per 2 ore di film, quindi ti ritroverai con circa 5-8 MBit / s. MPEG-2 non è molto efficiente in termini di compressione e funziona meglio con bitrate più alti.

  • Usa una specifica impostazione di qualità. Modificare -b:v … a -qscale:v 2. Il numero qui va da 1 a 31 e più alto significa qualità inferiore. Non ha senso andare oltre 4 o 5. Se non ti interessa il bitrate inizia con 2 e vedi se questo funziona per te.

Messing con il numero di fotogrammi di tipo B, il metodo di stima del movimento o la dimensione del GOP può modificare leggermente la qualità, ma non comporterà grandi cambiamenti.

Audio silenzioso

Uso -f lavfi -i aevalsrc=0 per generare un flusso audio silenzioso. Per esempio:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"

Potrebbe essere necessario aggiungere -target pal-dvd al comando precedente per forzare una determinata dimensione del buffer.

Ho scelto MP3 come codec. I file MPEG non possono contenere audio diverso dagli audio MPEG Layer I e II e dagli stream PCM, quindi l'uso di un file Ogg Vorbis silenzioso non funzionerà a meno che non si converta anche il flusso audio (che non è quello che si sta facendo quando si usa -c:a copy ).

Usa un codec video diverso

Sono sorpreso che una TV che riproduce file video leggerà MPEG-2 ma non nient'altro. Almeno MPEG-4 Parte II video dovrebbe essere supportato (è ciò che si conosce come "DivX" - un codificatore Parte II MPEG-4). Quindi potresti provare:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"

La tua TV potrebbe supportare anche H.264, ma solo un determinato profilo. Prova a usare il baseline profilo, ad esempio:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"

Nell'esempio precedente ho usato l'opzione CRF per impostare la qualità anziché qscale. Vedere il Guida alla codifica H.264 per più.


"Incastrarsi con il numero di fotogrammi di tipo B, il metodo di stima del movimento o la dimensione del GOP può modificare leggermente la qualità, ma non comporterà grandi cambiamenti". - Posso semplicemente rendere ogni fotogramma un fotogramma B e non utilizzare la stima del movimento con MPEG2? Il video ha molte parti MOLTO dinamiche.
Ivan

Ho provato la prima riga di comando che suggerisci ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4" ) - codifica circa 100 fotogrammi e poi inizia a riempire lo schermo con errori come [mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761 e [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Ivan

@ Ivan Modifica il bitrate con -b:v. Aggiunto alla mia risposta. Per quanto riguarda le impostazioni dell'encoder: non è possibile rendere ogni fotogramma B-frame. Inoltre, è necessaria la stima del movimento: più il metodo è completo, migliore è la compressione. Ma se si tratta di un video dinamico, la prima cosa che vorrai è aumentare significativamente il bitrate. Le impostazioni di codifica veramente non hanno un grande impatto Per quanto riguarda il tuo errore, sei sicuro che questo è l'errore del comando corretto? Un [mpeg] l'errore può accadere solo se il tuo file di output è .mpgnon quando è .mp4.
slhck

Ho copia = incollato una parte sbagliata, @slhck, sto usando ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg" ovviamente.
Ivan

1
-target pal-dvd risolve il problema, -bufsize non funziona (ho provato -b:v 7M -bufsize 7M -maxrate 7M ).
Ivan

0

Dirò immediatamente se la dimensione del file non ha molta importanza, quindi prova semplicemente ad aumentare il bit-rate.

Per l'audio silenzioso si potrebbe semplicemente voler usare ffmpeg, non so abbastanza su Audacity per dare alcun tipo di commento. Ho usato questo prima.

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

Questo però non funzionerà per te visto che stai usando il contenitore mpg, quindi potresti provare a farlo. (Contenitore mp3)

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

Sembrava funzionare per me.


L'impostazione della durata non è necessaria, poiché ffmpeg utilizzerà semplicemente tutto ciò che è necessario per il video.
slhck

Ho tenuto le cose al processo in due fasi come Ivan aveva fatto. Se trascuri la durata nel mio comando, allora non so per quanto tempo scadrà ffmpeg (probabilmente più a lungo di quanto vorrai).
dstob
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.