我有一个(合法获得和复制的)h264 mp4 蓝光翻录文件,我正在尝试减小它的尺寸。
我曾尝试通过 FFmpeg 和 HandBrake 将其编码为 h265,但结果是隔行扫描的视频(源不是隔行扫描的),看起来非常烦人。
我应该向 FFmpeg 指定哪些选项来防止这种情况发生?
到目前为止,我一直使用 FFmpeg 中编解码器的默认选项hevc_nvenc
以及 HandBrake 中等效编解码器。
编辑:
FFprobe 对输入文件的输出(仅相关流):
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
ffprobe
您的原始文件是隔行扫描。输出结果证实了这一点yuv420p(top first)
。top first
表示每对的顶部帧包含显示的第一行,因此包含每条奇数行,而底部帧包含要显示的每一条剩余(偶数)行。Video Stack exchange 在此处有更多信息:逐行扫描与上行扫描: Progressive vs Upper您在输出中看到隔行扫描的原因可能是,在
ffmpeg
未经过处理的情况下将隔行扫描视频转换为逐行扫描视频,或者以错误的顺序进行处理,导致帧之间的运动被错误地应用。许多现代播放器和视频卡可以自动处理去隔行,从而使隔行视频看起来像是真正的非隔行源。
但是,
ffmpeg
您实际上是在处理后的视频中“烘焙”隔行扫描,而不是让播放视频的程序来处理它。您可以使用滤镜将隔行扫描视频转换为逐行扫描视频。从如何使用 ffmpeg 进行去隔行扫描?您可以添加
yadif
视频滤镜来处理视频该
yadif
过滤器显然默认为tff
(顶部帧优先),与您的视频相匹配,因此过滤器应该可以正常工作。这里唯一的问题是
yadif
过滤器是基于 CPU 的算法,可能会减慢编码速度。您可能能够使用它yadif_cuda
来保持 GPU 上的转换,但我不能 100% 确定。另外,Nvidia 卡会自动对隔行扫描源进行去隔行扫描。我猜 AMD 或 Intel 卡也会这样做。在控制面板中,此选项默认为启用: