FFMPEG / x264:单次传递:如何提高起始时间比特率?

FFMPEG / x264:单次传递:如何提高起始时间比特率?

当使用指定了 VBV 大小的单通模式时,libx264 最初会“沙袋化”比特率,这可能是由于缺乏证据(或者甚至可能是错误)。(这是对这个问题的一个讽刺性的后续问题,它处理了单次编码过高的初始比特率VBV 规范

请参阅底部的比特率图表以了解更多信息:请注意原始下降,然后是过度校正(“嘿,我还剩下一些比特!”),然后才进行标准化。请注意,这在两遍解决方案中得到了纠正。这两个图表中缺少初始 I 帧可能是工具错误(初始 I 帧的 PTS 值为 0.15 秒)。

此效果可防止对长资产进行“分割、编码和重新组合”的并行处理,因为您会在每个片段的开头获得高质量的节拍。

可以通过双重编码来解决此问题,但这对于直播流来说是一个不可接受的解决方案(但是,如果并行化,则可能需要付出双重编码的代价)。

我希望有两种解决方案:任何帮助都将受到热烈欢迎。

  1. 单次通过解决方案,其中编码器被告知在产生输出之前最初保留更多帧,从而减少初始沙袋效应

  2. 一种以“管道”形式执行有限两遍编码的方法:以管道形式执行完整的两遍编码当然是没有意义的,但应该可以实现“微遍”,其中遍反馈周期大约为一秒。这比单遍解决方案更不理想,无法避免这种短暂的影响,但如果 (1) 不可能实现,则可以接受。

    • 单次通过比特率图:注意初始的“沙袋浸入”。生成方式:

ffmpeg -i 1080-60fps.mp4 -vf “scale=1200:720” -b:v 1000k -bufsize 1000k onepass.mp4

在此处输入图片描述

  • 两遍比特率图:这是接近理想的结果。请注意,这个最终形式不是必需的:避开最初的沙袋就足够了。生成方式:

ffmpeg -i 1080-60fps.mp4 -vf “scale=1200:720” -b:v 1000k -pass 1 -f mp4 /dev/null

ffmpeg -i 1080-60fps.mp4 -vf “scale=1200:720” -b:v 1000k -pass 2 twopass.mp4

两遍比特率图:这是预期结果

  • 单次编码中第一帧的部分

在此处输入图片描述

  • 两次编码中第一帧的部分

在此处输入图片描述

相关内容