使用 Windows ffmpeg 编码 H264 会导致前几秒出现“块状”

deg*_*ate 5 h.264 ffmpeg video-encoding

我使用以下代码将 10mbps 高质量 1280x720 H264 mp4 转码为较低质量的 H264 mp4,并在视频上添加我们的徽标水印。

ffmpeg.exe -i test.mp4 -i watermark.png -filter_complex overlay="(main_w)-(overlay_w):(main_h)-(overlay_h)" -c:v libx264 -profile:v main -preset Slow -b: v 400k -r 30 -c:a libvo_aacenc -b:a 128k -s 1280x720 -movflags faststart -f mp4 "test-done.mp4"

这些设置效果很好,经过大量调整以获得此代码,它可以生成清晰的视频,用于高动作、静态、许多不同的颜色等。

问题在于,在视频的前几秒钟,流非常阻塞。然后,大约 3-5 秒后,流会自行“纠正”,视频变得清晰。通过将预设更改为“veryslow”来减慢渲染时间只能略微改善前几秒的速度,但会显着增加渲染时间。

我怎样才能告诉 ffmpeg 更加关注视频的开头?我是否必须采用 2 遍编码?我不想将渲染时间增加近一倍,因为只有视频的前几秒有这个问题。有人可以修改我的代码以在文件开头提供更好的编码吗?

作为参考,原始的 10mbps mp4 是由 Premiere 5.0 编码的,并且在开始时没有块效应。这是我仅在转码后使用 ffmpeg 亲眼目睹的情况。

deg*_*ate 3

感谢@LordNeckbeard 提供的解决方案。看来 ffmpeg 使用 x264 编码-crf而不是-v:b.

因此-crf 26完美地消除了视频编码过程开始时的块效应。

我的最终代码现在是:

ffmpeg.exe -i test.mp4 -c:v libx264 -crf 26 -c:a libvo_aacenc -movflags faststart -f mp4 "test-done.mp4"
Run Code Online (Sandbox Code Playgroud)