Come creare un file video MPEG2 con la massima qualità ansible utilizzando FFMPEG?

Ho un file WMV (v9 (WMV3), 960×720, 30.000030 fps, planario 4: 2: 0 YUV, prodotto da PowerPoint 2010) e devo convertirlo in MPEG2 – l'unico formato che il mio TVset può leggere da un'unità flash USB (Ho anche provato MP4 / h.264, AVI / XVID – niente ma funziona MPEG2).

Sono riuscito a lavorare 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 è liscia (troppo lenta in alcuni momentjs).

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 '- ho cambiato il rendimento, la frequenza di aggiornamento e il formato di output (da VOB a MPG nudo)), ma la qualità è ancora troppo male.

Quali parametri devo usare per salvare la qualità più ansible? Il rapporto di compressione non import affatto, anche aumentare la dimensione del file è accettabile.

Anther cosa ho effettivamente bisogno (ho scelto di non includerlo nel titolo delle domande per evitare di renderlo troppo specifico, ma mi piacerebbe che venga considerato nelle risposte) è aggiungere il puro silenzio come una traccia sonora – non c'è suono nel originale ma il televisore si lamenta e vorrei sbarazzarsi di questo lamentarsi. Ho generato un file di OGG Vorbis di silenzio (second-preciso) con 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 persino nude

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

dà errori "buffer overflow" e "pacchetto troppo grande". (in.mpg sono i file prodotte dallo stesso file binario FFMPEG e lo stesso file WMV di origine usando i primi due comandi della domanda).

Sto utilizzando una Zeranoe FFMPEG build su Windows 7.

Il problema è che il bitrate predefinito per il MPEG-2 è piuttosto basso (come con la maggior parte degli altri encoder video in ffmpeg, mentre l'H.264 è un'exception). MPEG-2 non è anche la scelta migliore come codec in questi giorni.

Migliore qualità per MPEG-2

Hai qualche possibilità se vuoi attaccare con MPEG-2:

  • Aumenta il bitrate. Ora stai utilizzando -b:v 2500k . Se si tratta di un video HD, non si arriva molto a soli 2,5 Mbit / s. Hai bisogno di alless due o più per rendere il risultato ottimo. Ad esempio, utilizzare -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 vengono in circa 4,7 GB per 2 ore di film, per cui finisci con circa 5-8 MBit / s. MPEG-2 non è molto efficace in compressione e funziona meglio a bitrate più alti.

  • Utilizzare un'impostazione di qualità specifica. Modifica -b:v … a -qscale:v 2 . Il numero qui varia da 1 a 31 e più alto significa minore qualità. Non c'è niente di più che andare oltre 4 o 5. Se non ti interessa per il bitrate iniziare con 2 e vedere se funziona per te.

Messing con il numero di frame B, il metodo di stima del movimento o il formato GOP può modificare un po 'la qualità ma non provocherà grandi cambiamenti.

Audio silenzioso

Utilizza -f lavfi -i aevalsrc=0 per generare un stream 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 command precedente per forzare una certa dimensione del buffer.

Ho scelto MP3 come codec. I file MPEG non possono contenere audio diversi dagli stream MPEG Layer I e II e da flussi PCM, quindi utilizzare un file Ogg Vorbis silenzioso non functionrà a less che non si converta anche il stream audio (cosa che non stai facendo quando si utilizza -c:a copy ).

Utilizza un codec video diverso

Sono sorpreso che una TV che riproduce i file video leggerà MPEG-2 ma non altro. Alless MPEG-4 Part II video deve essere supportto (questo è quello che conosci come "DivX" – un encoder MPEG-4 Part II). 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 TV potrebbe anche supportre H.264, ma solo un certo profilo. Provate ad utilizzare il profilo di baseline , 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 la guida di codifica H.264 per ulteriori informazioni.

Direi immediatamente se la dimensione del file non import, allora sperimenta solo l'aumento del bit rate.

Per l'audio silenzioso si può solo utilizzare ffmpeg, non so abbastanza di Audacity per dare qualsiasi tipo di commento. Ho usato questo prima.

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

Questo non funziona per te anche se stai usando il contenitore mpg in modo che tu possa provare. (Contenitore mp3)

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

Sembrava che funzionasse per me.