Conversión de video de 1080p a 720p con la menor pérdida de calidad usando ffmpeg


45

Apilo con mi película de alta calidad: 1080p con 60 fps. El problema son los retrasos mientras se juega.

Traté de convertirlo a 720p con ffmpeg:

ffmpeg -i MyMovie.mkv -r 60 -s hd720 MyMovie_720p.mkv

Pero hay una pérdida de calidad significativa porque la velocidad de bits disminuyó de 32.3 Mbps a 2.8 Mbps. ¿Cómo puedo especificar la velocidad de bits correcta para la transmisión de video y dejar todas las demás transmisiones copiadas?

Archivo de entrada mediainfo:

ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L4.2
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 4 frames
Codec ID                                 : V_MPEG4/ISO/AVC
Duration                                 : 2h 58mn
Bit rate                                 : 32.3 Mbps
Width                                    : 1 920 pixels
Height                                   : 1 080 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 59.940 fps
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.260
Stream size                              : 40.2 GiB (92%)
Writing library                          : x264 core 116 r2019 9cc407d
Encoding settings                        : cabac=1 / ref=4 / deblock=1:-2:-1 / analyse=0x3:0x113 / me=umh / subme=10 / psy=1 / psy_rd=0.80:0.20 / mixed_ref=1 / me_range=32 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-3 / threads=6 / sliced_threads=0 / nr=0 / decimate=0 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=6 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=0 / crf=14.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / vbv_maxrate=50000 / vbv_bufsize=62500 / crf_max=0.0 / nal_hrd=none / ip_ratio=1.40 / pb_ratio=1.30 / aq=1:0.60
Language                                 : English
Default                                  : Yes
Forced                                   : No
Matrix coefficients 

                 : BT.709-5, BT.1361, IEC 61966-2-4 709, SMPTE RP177

Respuestas:


93

Aquí hay un ejemplo que debería darle el video de más alta calidad (no estoy hablando sobre el tamaño del archivo resultante). Tenga en cuenta que este video podría no reproducirse en todos los dispositivos o reproductores:

ffmpeg -i MyMovie.mkv -vf scale=-1:720 -c:v libx264 -crf 0 -preset veryslow -c:a copy MyMovie_720p.mkv

Para obtener una calidad "sin pérdidas visuales", puede usar:

ffmpeg -i MyMovie.mkv -vf scale=-1:720 -c:v libx264 -crf 18 -preset veryslow -c:a copy MyMovie_720p.mkv

Ahora veamos qué tenemos aquí:

El filtro de video de escala es para cambiar el tamaño del video. Simplemente establece un tamaño, que es la altura en este ejemplo, y lo utiliza -1para la otra dimensión. ffmpeg volverá a calcular el valor correcto automáticamente mientras conserva la relación de aspecto.

Calidad controlada con la -crfopción:

El rango de la escala del cuantificador es 0-51: donde 0 es sin pérdidas, 23 es el predeterminado y 51 es el peor posible. Un valor más bajo es una calidad más alta y un rango subjetivamente sensato es 18-28. Considere que 18 es visualmente sin pérdidas o casi: debería verse igual o casi igual que la entrada, pero técnicamente no es sin pérdidas.

El rango es exponencial, por lo que aumentar el valor de CRF +6 es aproximadamente la mitad de la tasa de bits, mientras que -6 es aproximadamente el doble de la tasa de bits. El uso general es elegir el valor de CRF más alto que aún proporcione una calidad aceptable. Si el resultado se ve bien, intente con un valor más alto y si se ve mal, elija un valor más bajo.

Puede encontrar más información en la guía de codificación x264 .

Usted controla la compensación entre la velocidad de codificación de video y la eficiencia de compresión con las -presetopciones. Esos son ultrarrápidos, superrápidos, muy rápidos, más rápidos, rápidos, medios, lentos, más lentos, muy lentos . El valor predeterminado es medio . La opción veryslow ofrece la mejor eficiencia de compresión (lo que resulta en un tamaño de archivo más pequeño para la misma calidad) pero es muy lenta, como su nombre lo indica.

El audio se transmitirá directamente desde el archivo de entrada al archivo de salida sin ningún cambio.


2
LordNeckbeard: gracias por editar. No tuve tiempo suficiente para escribir todos los detalles
Nikola Dimitrijevic

1
Su ejemplo es establecer la altura a 720, no el ancho.
chovy

¿Puedes hacer esto al revés? Video.stackexchange.com/questions/20439/…
William

2
Para copiar también subtítulos en mkv sin convertir, puede agregar -scodec copy.
Casper

2
Creo que para obtener 720p debe establecer el ancho en 1280, es decir, -vf scale=-1:720pero no -vf scale=1280:-1.
cdlvcdlv

0

En caso de que desee escalar en un tamaño diferente, existen algunas limitaciones en las dimensiones de escala FFMPEG. No acepta cada altura, aquí hay una pequeña lista de las mejores recomendaciones para las dimensiones.

Los códecs de video funcionan mejor cuando el ancho y la altura en píxeles son múltiplos de 16. Si bien puede usar cualquier ancho y altura en la configuración de codificación, las dimensiones no óptimas pueden dar como resultado una calidad de imagen deficiente y una velocidad de cuadro reducida. Para obtener la mejor calidad de imagen y reproducción, debe usar dimensiones de ancho y alto para su video que sean múltiplos de 16; su próxima mejor opción es múltiplos de 8, y después de eso, múltiplos de 4.

Recommended width and height for videos with 16:9 aspect ratios:

Best Choice:     2nd Best:        3rd Best:
Multiples of 16  Multiples of 8   Multiples of 4
1920 x 1080      1792 x 1008      1856 x 1044
1280 x 720       1152 x 648       1216 x 684
1024 x 576        896 x 504       1088 x 612
 768 x 432        640 x 360        960 x 540
 512 x 288        384 x 216        832 x 468
 256 x 144        128 x 72         704 x 396
                                   576 x 324
                                   448 x 252
                                   320 x 180
                                   192 x 108
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.