Convertendo vídeo de 1080p para 720p com a menor perda de qualidade usando ffmpeg


45

Eu empilhei com o meu filme de alta qualidade: 1080p a 60fps. O problema é atrasado durante o jogo.

Eu tentei convertê-lo para 720p com ffmpeg:

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

Mas há uma perda significativa de qualidade porque a taxa de bits diminuiu de 32,3 Mbps para 2,8 Mbps. Como posso especificar a taxa de bits correta para o fluxo de vídeo e deixar todos os outros fluxos copiados intocados?

Arquivo 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

Respostas:


93

Aqui está um exemplo que deve fornecer o vídeo da mais alta qualidade (não estou falando do tamanho do arquivo resultante). Observe que este vídeo pode não ser reproduzido em todos os dispositivos ou players:

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

Para obter uma qualidade "visualmente sem perdas", você pode usar:

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

Agora vamos ver o que temos aqui:

O filtro de vídeo em escala é para redimensionar o vídeo. Você acabou de definir um tamanho - que é a altura neste exemplo - e usar -1para a outra dimensão. O ffmpeg recalcula o valor correto automaticamente, preservando a proporção.

Qualidade controlada com a -crfopção:

O intervalo da escala do quantizador é de 0 a 51: onde 0 é sem perdas, 23 é o padrão e 51 é o pior possível. Um valor mais baixo é uma qualidade mais alta e uma faixa subjetivamente sã é de 18 a 28. Considere 18 como sendo visualmente sem perdas ou quase o mesmo: deve ser igual ou quase igual à entrada, mas não é tecnicamente sem perdas.

O intervalo é exponencial, portanto, aumentar o valor de CRF +6 é aproximadamente metade da taxa de bits, enquanto -6 é aproximadamente duas vezes a taxa de bits. O uso geral é escolher o valor mais alto de CRF que ainda forneça uma qualidade aceitável. Se a saída parecer boa, tente um valor mais alto e, se parecer ruim, escolha um valor mais baixo.

Você pode encontrar mais informações no guia de codificação x264 .

Você controla a troca entre velocidade de codificação de vídeo e eficiência de compactação com as -presetopções. Essas são ultra-rápidas, super-rápidas, muito rápidas, mais rápidas, rápidas, médias, lentas, mais lentas, muito baixas . O padrão é médio . A opção veryslow oferece a melhor eficiência de compactação (resultando em um tamanho de arquivo menor para a mesma qualidade), mas é muito lenta - como o nome indica.

O áudio será copiado diretamente do arquivo de entrada para o arquivo de saída sem nenhuma alteração.


2
LordNeckbeard - obrigado pela edição. Eu não tive tempo suficiente para digitar todos os detalhes
Nikola Dimitrijevic

11
Seu exemplo é definir altura para 720, não largura.
Chovy

Você pode fazer isso de trás para frente video.stackexchange.com/questions/20439/…
William

2
Para também copiar legendas em mkv sem converter, você pode adicionar -scodec copy.
Casper

2
Eu acho que para obter 720p você deve definir a largura para 1280 ou seja, -vf scale=-1:720mas não -vf scale=1280:-1.
Cdlvcdlv

0

Caso você queira dimensionar em um tamanho diferente, existem algumas limitações nas dimensões de dimensionamento do FFMPEG. Ele não aceita cada altura. Aqui está uma pequena lista das melhores recomendações para dimensões.

Os codecs de vídeo têm melhor desempenho quando a largura e a altura em pixels são múltiplos de 16. Embora você possa usar qualquer largura e altura nas configurações de codificação, dimensões não ideais podem resultar em baixa qualidade de imagem e taxa de quadros reduzida. Para obter a melhor qualidade e reprodução de imagem, você deve usar as dimensões de largura e altura do seu vídeo com múltiplos de 16; sua próxima melhor opção é múltiplos de 8 e, depois disso, 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.