¿Cómo convertir 1080 @ 50i -> 720 @ 50p usando ffmpeg?


9

Me gusta mucho el video de 50 fps, pero no puedo hacer que ffmpeg lo convierta a 50 fps para mí.

La resolución de 720p está absolutamente bien para mí, solo necesito más FPS.

50i se ve mucho más suave en los reproductores adecuados (por ejemplo, el video desentrelazado del reproductor GOM y lo reproduce a 50 Hz. Gran diferencia con el video de 25 Hz.) ...

Mi línea de comando actual es:

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

Aquí hay más detalles del video. La fuente de video es de la videocámara Canon 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

¿Qué quieres decir con 'no puedo hacer'? ¿Te da errores?
Just Jake

Produce un archivo, que parece 25p, no tan suave como 50i en el reproductor adecuado.
BarsMonster

@slhck Aquí va
BarsMonster

Cualquier motivo específico para la codificación a MPEG-4 Visual en lugar de usar h.264 de nuevo (por ejemplo, -vcodec libx264? No es que deba importar mucho a ~ 20 MBit / s, pero aún así.
slhck

@slhck bueno, es por defecto :-)
BarsMonster

Respuestas:



6

Al igual que el entrelazado, el contenido progresivo divide cada cuadro en 2 campos, duplicando así la velocidad de cuadros, el método común de desentrelazado es combinar cada uno de los 2 campos en 1 cuadro, lo que reduce la velocidad en 2, lo que lleva a 50 a 25 fps. Por supuesto, puede duplicar cada fotograma final, pero eso no proporciona ningún beneficio.

Primero, podemos leer para no usar -deinterlace, y yadif en su lugar (lo que usted ya hace):

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

Probablemente encontrarás el seccion yadif De la documentación de FFMPEG bastante interesante:

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 cómo el MODO predeterminado es 0, lo que indica a FFMPEG que genere 1 fotograma para cada 2 campos, reduciendo a la mitad los fps. Creo que lo que estás buscando es MODO 1: un cuadro por campo . No estoy muy seguro de cómo usar estos parámetros opcionales pero quizás algo como

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

Al menos da una salida de 50 fps, pero desafortunadamente, los 2 cuadros secuenciales generados son muy similares ... Mientras que cuando paso el video original 50i cuadro por cuadro realmente veo que el movimiento rápido tiene dos pasos más, y mucho más suave.
BarsMonster

@BarsMonster Primero, intentaría averiguar qué hace el jugador GOM, en caso de que se deba a algún tipo de interpolación. Tengo curiosidad: ¿hay tanto contenido entrelazado que contenga información de alto fps? (Después de todo, la conversión de 25p a 50i para la transmisión no crea ninguna nueva información de movimiento; necesita contenido entrelazado y recto). A continuación, si encuentra una técnica de desentrelazado que usa GOM (vea wikipedia, hay bastantes), debe tratar de encontrar un filtro que se pueda usar en AVISYNTH como parte del proceso en lugar de usar el método -FADFEGEG .
mtone

1

De acuerdo con la documentación , la -r La opción establece los cuadros de archivo de salida por segundo. Por ejemplo, esto establece la salida a 50 cuadros por segundo:

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

Desafortunadamente, el archivo producido es aproximadamente el mismo que para -r 25. Y ya no es tan bueno. Parece que solo tomó video de 25p, y luego lo enmarcó y lo duplicó.
BarsMonster

¿Has intentado especificar también la velocidad de fotogramas de entrada?
Just Jake

3
Eso se espera. Cuando desentrelaza el video, sacrificas el movimiento suave para que sea compatible con las pantallas progresivas.
Jason

@Jason Bueno, mi reproductor de video (GOM Player) desentrelaza el video 50i y lo muestra sin problemas (es decir, a 50Hz) en mi monitor TFT de 120Hz, que obviamente es progresivo. ¿Por qué el grabador de video no puede hacer lo mismo y producir una salida suave de 50 Hz? Entiendo que el 50i tiene menos detalles pequeños, pero ¿por qué no puedo esperar obtener una salida de 50Hz?
BarsMonster

Depende del filtro de desentrelazado utilizado. Obviamente, GOM Player hace un buen trabajo en esto. Sin embargo, no sé mucho sobre cómo FFmpeg maneja el video entrelazado. @BarsMonster
slhck

1

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


1
Desafortunadamente, todavía produjo solo 25 fps de salida ... El archivo original es mucho más suave ... Incluso la adición de -r 50 no ayudó.
BarsMonster

0

Este comando está trabajando para mí:

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 fuente fue un archivo de videocámara de Sony.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.