Esta linha de comando reduz meu vídeo 4k:
$ ffmpeg -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i input_video.mkv -vf scale_cuda=1920:1080:interp_algo=bicubic -c:v hevc_nvenc -preset slow -rc vbr -rc-lookahead 20 -b:v 1M -bufsize 5M -maxrate 1M -g 250 -an -sn output_video.mkv
Mas se eu tentar cortar as barras pretas com -crop=3840:1608:0:276
, elas permanecerão no destino do arquivo de vídeo:
$ ffmpeg -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i input_video.mkv -vf -crop=3840:1608:0:276,scale_cuda=1920:804:interp_algo=bicubic -c:v hevc_nvenc -preset slow -rc vbr -rc-lookahead 20 -b:v 1M -bufsize 5M -maxrate 1M -g 250 -an -sn output_video.mkv
crop
O filtro é executado na CPU, mas os quadros decodificados estão na memória do dispositivo GPU.Para usar
crop
o filtro (CPU), podemos usarhwdownload,crop...,hwupload
... (baixar os frames para a memória do sistema, aplicar o corte na CPU e fazer upload para a GPU para codificação).Mas é ineficiente...
Gostamos de procurar por "filtro de dispositivo" de GPU como
crop_cuda
, mas não há nenhum.Felizmente,
hevc_cuvid
o decodificador e o argumentoh264_cuvid
de suporte do decodificador-crop
.Observe que este é um recurso de decodificador e não um filtro de vídeo.
Suponha que o codec de vídeo
input_video.mkv
seja HEVC (H.265), podemos usar o seguinte comando:ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -c:v hevc_cuvid -crop 276x552x0x0 -i input_video.mkv -vf scale_cuda=1920:804:interp_algo=bicubic -c:v hevc_nvenc -preset slow -rc vbr -rc-lookahead 20 -b:v 1M -bufsize 5M -maxrate 1M -g 250 -an -sn output_video.mkv
Caso o codec de entrada seja H.264, substitua
hevc_cuvid
porh264_cuvid
.A execução
ffmpeg -h decoder=hevc_cuvid
(para obter ajuda) nos diz que a-crop
sintaxe é:Crop (top)x(bottom)x(left)x(right)
.Isso significa número de linhas superiores a serem removidas, número de linhas inferiores a serem removidas, número de colunas à esquerda e número de colunas à direita a serem removidas.
Teste:
Crie uma entrada codificada H.265 sintética (para teste):
ffmpeg -y -f lavfi -i testsrc=size=3840x2160:rate=1:duration=100 -c:v libx265 input_video.mkv
Execute o comando:
ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -c:v hevc_cuvid -crop 276x552x0x0 -i input_video.mkv -vf scale_cuda=1920:804:interp_algo=bicubic -c:v hevc_nvenc -preset slow -rc vbr -rc-lookahead 20 -b:v 1M -bufsize 5M -maxrate 1M -g 250 -an -sn output_video.mkv
A resolução de saída é 1920x804.