我想减少一些大约 2k kbps 的流撕裂。
ffmpeg -ss 4:00 -to 4:10 -i in.mp4 -an -vcodec libx265 -crf 26 -preset slow 26s.mp4
ffmpeg -ss 4:00 -to 4:10 -i in.mp4 -an -vcodec libx265 -crf 26 -preset slow -vf fps=30 26sr.mp4
第一个是 60 fps 和 839 KB。第二个是 30 fps 和 807 KB。为什么会有这么小的差异?
因为在视频编解码器中,帧之间的差异被记录下来,很少是完整的帧。在现代视频编解码器,尤其是x265 中,预测技术(主要是运动预测)用于甚至不存储场景元素何时以与之前移动相同的速度移动。
因此,通过删除帧,您可以使彼此跟随的帧更加独立,从而包含更多信息,即使它只有一半。
特别是:您特别要求编码器大致达到相同的视觉质量——CRF——这意味着如果一个帧与其他帧有更大的不同,它将以更高的量化进行编码,产生更多的比特。这正是您使用 CRF 设置表达的意图!如果你想要一个更小的文件,减少 CRF 设置,或者通过运行来获得平均比特率设置
-b:v {desired bitrate, e.g. 200k} -x265-params pass=1 -f null /dev/null
在第一次通过时,和-b:v {same as above} -x265-params pass=2 26s.mp4
在第二遍。另一个技巧,尤其是在运动可能是零星的视频材料中(视频通话参与者的视频!但监控视频、动物园网络摄像头可能更是如此),是根本不指定帧速率——这对于某种情况来说根本不是很有用对于场景中的某些部分变化不大,而在其他部分中,会出现快速的视觉差异——但使用自适应帧速率。对于 ffmpeg 中的 x265,就是
-vsync 2
这样;当然,您需要删除-vf fps=...
它才能工作。