此命令行可精细缩小我的 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
但如果我尝试使用 裁剪黑条-crop=3840:1608:0:276
,它们仍保留在视频文件目标上:
$ 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
过滤器在CPU上执行,但解码后的帧在GPU设备的内存中。为了使用
crop
(CPU)过滤器,我们可以使用hwdownload,crop...,hwupload
...(将帧下载到系统内存,在CPU中应用裁剪,然后上传到GPU进行编码)。但效率低下……
我们喜欢寻找类似的GPU“设备过滤器”
crop_cuda
,但没有。幸运的是
hevc_cuvid
解码器和h264_cuvid
解码器都支持-crop
参数。请注意,这是解码器功能,而不是视频过滤器。
假设视频编解码器
input_video.mkv
是HEVC(H.265),我们可以使用以下命令: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
如果输入编解码器是 H.264,则替换
hevc_cuvid
为h264_cuvid
。执行
ffmpeg -h decoder=hevc_cuvid
(寻求帮助),告诉我们语法-crop
是:Crop (top)x(bottom)x(left)x(right)
。这意味着要删除的顶部行数、要删除的底部行数、要删除的左侧列数和右侧列数。
测试:
创建合成 H.265 编码输入(用于测试):
ffmpeg -y -f lavfi -i testsrc=size=3840x2160:rate=1:duration=100 -c:v libx265 input_video.mkv
执行命令:
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
输出分辨率为 1920x804。