Come convertire 1080 @ 50i -> 720 @ 50p usando ffmpeg?


9

Mi piacciono molto i video a 50 fps, ma non riesco a convertire ffmpeg in 50 fps per me.

La risoluzione a 720p va bene per me, ho solo bisogno di più FPS.

50i sembra molto più fluido nei lettori appropriati (ad esempio GOM Player deinterlaccia il video e lo riproduce a 50Hz. Una differenza molto grande rispetto al video a 25Hz.) ...

La mia riga di comando corrente è:

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi

Ecco altri dettagli sul video. Il video di origine proviene dal camcoder Cannon HF10 AVCHD.

ffmpeg -i 00010.MTS -threads 3 -filter:v yadif -s "1280x720" -r 50 -b:v 20M output.avi
ffmpeg version N-37541-g670229e Copyright (c) 2000-2012 the FFmpeg developers
  built on Feb  3 2012 20:14:17 with gcc 4.6.2
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-ru
ntime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libope
ncore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --en
able-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger -
-enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwben
c --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-
libxvid --enable-zlib
  libavutil      51. 37.100 / 51. 37.100
  libavcodec     54.  0.102 / 54.  0.102
  libavformat    54.  0.100 / 54.  0.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 61.100 /  2. 61.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  6.100 /  0.  6.100
  libpostproc    52.  0.100 / 52.  0.100
[h264 @ 000000000033FA30] Increasing reorder buffer to 1
Input #0, mpegts, from '00010.MTS':
  Duration: 00:03:13.92, start: 0.482156, bitrate: 16304 kb/s
  Program 1
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1
080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, s16,
256 kb/s
File 'output.avi' already exists. Overwrite ? [y/N] y
w:1920 h:1080 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
[yadif @ 0000000003CE95B0] mode:0 parity:-1 auto_enable:0
[scale @ 0000000003CE9550] w:1920 h:1080 fmt:yuv420p -> w:1280 h:720 fmt:yuv420p
 flags:0x4
Output #0, avi, to 'output.avi':
  Metadata:
    ISFT            : Lavf54.0.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720 [SAR 1:1 DA
R 16:9], q=2-31, 20000 kb/s, 50 tbn, 50 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16, 128 kb
/s
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> mpeg4)
  Stream #0:1 -> #0:1 (ac3 -> libmp3lame)
Press [q] to stop, [?] for help
frame=   15 fps=  0 q=2.0 size=     945kB time=00:00:00.62 bitrate=12481.3kbits/
frame=   32 fps= 32 q=2.0 size=    2132kB time=00:00:01.30 bitrate=13435.2kbits/
frame=   51 fps= 34 q=2.0 size=    3372kB time=00:00:02.06 bitrate=13409.2kbits/
frame=   70 fps= 35 q=2.0 size=    4641kB time=00:00:02.82 bitrate=13482.8kbits/
frame=   76 fps= 35 q=2.0 Lsize=    5047kB time=00:00:03.06 bitrate=13511.9kbits

Cosa intendi con "impossibile fare"? Ti dà errori?
Solo Jake

Produce file, che assomiglia a 25p, non liscio come 50i nel lettore corretto.
Bars Mons.

@slhck Ecco qui
BarsMonster il

Qualsiasi motivo specifico per la codifica in MPEG-4 Visual invece di utilizzare nuovamente h.264 (ad esempio -vcodec libx264? Non che dovrebbe importare così tanto a ~ 20 MBit / s, ma comunque.
slhck

@slhck bene, è solo predefinito :-)
BarsMonster

Risposte:



7

Proprio come l'interlacciamento del contenuto progressivo divide ogni fotogramma in 2 campi, raddoppiando così la frequenza dei fotogrammi, il metodo comune di deinterlacciamento consiste nel combinare ogni 2 campi in 1 fotogramma, il che riduce la frequenza di 2, portando da 50 a 25 fps. Ovviamente puoi raddoppiare ogni fotogramma finale, ma ciò non offre alcun vantaggio.

Per prima cosa, possiamo leggere per non usare -deinterlace e yadif (cosa che già fai):

 - deinterlace This option is deprecated since the deinterlacing is very low quality. Use the yadif filter with -filter:v yadif. 

Probabilmente troverai interessante la sezione yadif della documentazione di FFMPEG:

Deinterlace the input video ("yadif" means "yet another deinterlacing filter"). 
It accepts the optional parameters: mode:parity:auto. 

MODE specifies the interlacing mode to adopt, accepts one of the following values: 
‘0’
output 1 frame for each frame
‘1’
output 1 frame for each field 
‘2’
like 0 but skips spatial interlacing check 
‘3’
like 1 but skips spatial interlacing check 
Default value is 0. 

PARITY default value is -1.
AUTO default value is 0. 

Notare come la MODALITÀ predefinita è 0, che indica a FFMPEG di produrre 1 fotogramma per ogni 2 campi, dimezzando così gli fps. Penso che quello che stai cercando sia la MODALITÀ 1: un frame per campo . Non sono troppo sicuro di come usare questi parametri opzionali, ma forse qualcosa del genere

-filter:v yadif 1:-1:0 -s "1280x720" -r 50 

Almeno dà un output di 50 fps, ma sfortunatamente 2 frame sequenziali generati sono molto simili ... Mentre quando passo i video 50i originali fotogramma per fotogramma vedo davvero che il movimento veloce ha due "passi" in più e molto più fluido.
BarsMonster

@BarsMonster In primo luogo, proverei a scoprire cosa fa il lettore GOM, nel caso sia dovuto a qualche forma di interpolazione. Sono curioso: c'è così tanto contenuto interlacciato che contiene informazioni ad alto fps? (Dopotutto, la conversione di un 25p in 50i per la trasmissione non crea nuove informazioni di movimento - sono necessari contenuti strettamente interlacciati). Successivamente, se trovi una tecnica di deinterlacciamento che utilizza GOM (vedi Wikipedia, ce ne sono alcune), dovresti provare a trovare un filtro che può essere usato in AVISYNTH come parte del processo invece di usare il metodo -YADIF di FFMPEG .
mtone,

1

Secondo la documentazione , l' -ropzione imposta i frame dei file di output al secondo. Ad esempio, questo imposta l'output su 50 frame al secondo:

ffmpeg -i input.avi -r 50 output.avi

Sfortunatamente, il file prodotto è più o meno lo stesso di -r 25. E non è più uniforme. Sembra che abbia appena preso un video a 25p, quindi lo ha duplicato.
Bars Mons.

Hai provato a specificare anche il framerate di input?
Solo Jake

3
Questo è scontato. Quando si deinterlaccia il video si sacrifica il movimento regolare per compatibilmente con display progressivi.
Jason,

@Jason Bene, il mio videoregistratore (GOM Player) deinterlaccia il video 50i e lo mostra senza problemi (cioè a 50Hz) sul mio monitor TFT a 120Hz, che è ovviamente progressivo. Perché il videoregistratore non può fare la stessa cosa e produrre un'uscita regolare a 50Hz? Capisco che 50i abbia dettagli meno piccoli, ma perché non posso aspettarmi di ottenere un output a 50Hz?
BarsMonster

Dipende dal filtro di deinterlacciamento utilizzato. Ovviamente GOM Player fa un buon lavoro in questo. Non so troppo su come FFmpeg gestisce i video interlacciati. @BarsMonster
slhck

1

ffmpeg -i input.avi -deinterlace -filter:v yadif -s "1280x720" output.avi


1
Sfortunatamente, ha comunque prodotto solo 25 fps di output ... Il file originale è molto più fluido .... Anche l'aggiunta di -r 50 non ha aiutato.
BarsMonster

0

Questo comando funziona per me:

ffmpeg -i source_50i.MTS -aspect 1920:1080 -vf yadif=1,scale=1920:1080 -c:v libx264 -preset fast -profile:v high -crf 23 -ac 2 -strict experimental -c:a aac -b:a 96k -movflags +faststart -y result_50p.mp4

La fonte era un file della videocamera Sony.

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.