Tenho um Blu-Ray rip (obtido e copiado legalmente) em h264 mp4, que estou tentando reduzir o tamanho.
Tentei codificá-lo em h265 via FFmpeg e HandBrake, mas o resultado é um vídeo entrelaçado (a fonte não é entrelaçada), o que é muito chato de assistir.
Quais opções devo especificar no FFmpeg para evitar isso?
Até agora usei as opções padrão para o hevc_nvenc
codec no FFmpeg e o codec equivalente no HandBrake.
Close-up de um quadro de origem não entrelaçado:
Close-up de um quadro de resultado entrelaçado:
EDITAR:
Saída do arquivo de entrada do FFprobe (único fluxo relevante):
Stream #0:0(eng): Video: h264 (High), yuv420p(top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 1k tbn
Metadata:
BPS-eng : 26434120
DURATION-eng : 01:58:41.013900000
NUMBER_OF_FRAMES-eng: 213417
NUMBER_OF_BYTES-eng: 23529714835
SOURCE_ID-eng : 001011
_STATISTICS_WRITING_APP-eng: MakeMKV v1.17.7 win(x64-release)
_STATISTICS_WRITING_DATE_UTC-eng: 2024-07-26 11:27:31
_STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES SOURCE_ID
Seu arquivo original está entrelaçado. Isso é confirmado pela
ffprobe
saída que dizyuv420p(top first)
.top first
indica que o quadro superior de cada par contém a primeira linha da exibição e, portanto, todas as linhas ímpares, enquanto o quadro inferior contém todas as linhas restantes (pares) para exibir. O Video Stack Exchange tem mais informações aqui: Progressive vs UpperO motivo pelo qual você está vendo entrelaçamento na saída é provavelmente porque
ffmpeg
o vídeo entrelaçado está sendo convertido em um vídeo progressivo sem processamento ou está sendo processado em uma ordem incorreta, resultando em movimento entre os quadros sendo aplicado incorretamente.Muitos reprodutores e placas de vídeo modernos controlam automaticamente o desentrelaçamento e podem, assim, fazer com que um vídeo entrelaçado pareça uma fonte verdadeiramente não entrelaçada.
Mas com isso
ffmpeg
você está essencialmente "assando" o entrelaçamento no vídeo processado em vez de deixar que o programa que reproduz o vídeo cuide disso.Você pode converter um vídeo entrelaçado em um vídeo progressivo usando um filtro. De Como desentrelaçar com ffmpeg? você pode adicionar o
yadif
filtro de vídeo para processar o vídeoO
yadif
filtro aparentemente tem como padrãotff
(quadro superior primeiro), o que corresponde ao seu vídeo, então o filtro deve funcionar corretamente.O único problema aqui é que o
yadif
filtro é um algoritmo baseado em CPU que pode tornar a codificação mais lenta. Você pode usaryadif_cuda
para manter a conversão na GPU, mas não tenho 100% de certeza.Como um aparte, uma placa Nvidia irá desentrelaçar automaticamente fontes que são entrelaçadas. Eu presumo que placas AMD ou Intel farão o mesmo. No painel de controle, esta opção está ativada por padrão: