Como converter 1080 @ 50i -> 720 @ 50p usando ffmpeg?

9

Eu gosto muito do vídeo de 50fps, mas não consigo fazer o ffmpeg convertê-lo para 50fps para mim.

Resolução de 720p é absolutamente bem comigo, só precisa de mais FPS.

50i só parece muito mais suave em jogadores adequados (por exemplo, GOM Player desentrelaça vídeo e reproduz a 50 Hz. Muito grande diferença para vídeo de 25 Hz.) ...

Minha linha de comando atual é:

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

Aqui estão mais detalhes de vídeo. O vídeo de origem é da 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
BaresMonstro
fonte
O que você quer dizer com 'não pode fazer'? Isso lhe dá erros?
Apenas Jake
Ele produz arquivo, que parece 25p, não tão suave quanto 50i no player adequado.
BarsMonster
@slhck Aqui vai
BarsMonster
Qualquer razão específica para a codificação para o MPEG-4 Visual em vez de usar h.264 novamente (por exemplo, -vcodec libx264não que isso deva importar tanto a ~ 20 MBit / s, mas ainda assim.
Slhck
@slhck bem, é apenas o padrão :-)
BarsMonster

Respostas:

1

"Para a maioria dos casos práticos, não é possível recuperar um vídeo progressivo completo de conteúdo entrelaçado."

Além disso, se você pudesse fazer o upload de uma pequena amostra do vídeo, isso ajudaria sua causa tremendamente.

Fonte: mplayerhq.hu/DOCS/HTML/en/menc-feat-telecine.html

Steven Penny
fonte
7

Assim como o entrelaçamento de conteúdo progressivo divide cada quadro em dois campos, dobrando a taxa de quadros, o método comum de desentrelaçamento é combinar cada um dos dois campos em um quadro, o que reduz a taxa em dois, levando 50 para 25fps. Você pode, claro, dobrar cada quadro final, mas isso não traz nenhum benefício.

Primeiro, podemos ler para não usar -deinterlace e yadif (o que você já faz):

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

Você provavelmente encontrará a seção yadif da documentação do FFMPEG bem interessante:

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. 

Observe como o MODE padrão é 0, que instrui o FFMPEG a enviar 1 quadro para cada 2 campos, diminuindo assim o fps. Acho que o que você está procurando é o MODO 1: um quadro por campo . Eu não tenho certeza de como usar esses parâmetros opcionais, mas talvez algo como

-filter:v yadif 1:-1:0 -s "1280x720" -r 50 
mtone
fonte
Pelo menos dá 50 fps de saída, mas infelizmente 2 quadros seqüenciais gerados são muito similares ... Enquanto eu passo vídeo 50i original quadro a quadro eu realmente vejo que o movimento rápido tem duas vezes mais "passos", e muito mais suave.
BarsMonster
@BarsMonster Primeiro, eu tentaria descobrir o que o GOM player faz, caso isso se deva a alguma forma de interpolação. Estou curioso - há muito conteúdo entrelaçado que contém informações de alta fps? (Afinal, a conversão de 25p para 50i para transmissão não cria nenhuma nova informação de movimento - você precisa de um conteúdo entrelaçado para o entrelaçado). Em seguida, se você encontrar uma técnica de desintercalação que o GOM usa (veja wikipedia, existem várias), você deve tentar encontrar um filtro para ele que possa ser usado no AVISYNTH como parte do processo, em vez de usar o método YADIF do FFMPEG .
mtone
1

De acordo com a documentação , a -ropção define os quadros de arquivos de saída por segundo. Por exemplo, isso define a saída para 50 quadros por segundo:

ffmpeg -i input.avi -r 50 output.avi
Apenas Jake
fonte
Infelizmente, o arquivo produzido é quase o mesmo que para -r 25. E não é mais smoooth. Parece que acabou de tirar um vídeo de 25p e depois enquadrou-o.
BarsMonster
Você já tentou especificar também o framerate de entrada?
Apenas Jake
3
Isso é excitado. Quando você desentrelaça o vídeo, você sacrifica o movimento suave de forma compatível com as exibições progressivas.
Jason
@Jason Bem, meu reprodutor de vídeo (GOM Player) desentrelaça o vídeo 50i e o mostra suavemente (ou seja, a 50Hz) no meu monitor TFT de 120Hz, que é obviamente progressivo. Por que o decodificador de vídeo não pode fazer a mesma coisa e produzir uma saída suave de 50Hz? Eu entendo que 50i têm menos detalhes pequenos, mas por que não posso esperar obter uma saída de 50Hz?
BarsMonster
Depende do filtro de desentrelaçamento usado. Obviamente, o GOM Player faz um bom trabalho nisso. Não sei muito sobre como o FFmpeg lida com vídeo entrelaçado. @BarsMonster
slhck
1

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

Jason
fonte
1
Infelizmente, ainda produziu apenas 25 qps de saída ... O arquivo original é muito mais suave ... Até mesmo adicionar -r 50 não ajudou.
BarsMonster
0

Este comando está funcionando para mim:

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

A fonte era um arquivo de filmadora da Sony.

ecchphoto
fonte