FFmpeg:生成的视频的帧大小比预期的要大得多

FFmpeg:生成的视频的帧大小比预期的要大得多,ffmpeg,video-encoding,Ffmpeg,Video Encoding,在游戏期间,我将帧(屏幕缓冲区)记录为NumPy阵列,分辨率为“400x225”。每个帧阵列的大小为270.1 kB 保存这些帧后,我使用下面的bash命令创建一个mp4文件(游戏以每秒35帧的速度运行): 然后,我使用一个工具从使用上面的命令创建的视频中生成一个帧数据的CSV文件。输出如下。奇怪的是,如果我们把前35帧加起来(视频是用“-r 35”参数录制的,因为游戏以35 FPS的速度运行),我们得到大约18k kbit 对于400x225视频,18k kbit/sec比特率超高。生成视频时

在游戏期间,我将帧(屏幕缓冲区)记录为NumPy阵列,分辨率为“400x225”。每个帧阵列的大小为270.1 kB

保存这些帧后,我使用下面的bash命令创建一个mp4文件(游戏以每秒35帧的速度运行):

然后,我使用一个工具从使用上面的命令创建的视频中生成一个帧数据的CSV文件。输出如下。奇怪的是,如果我们把前35帧加起来(视频是用“-r 35”参数录制的,因为游戏以35 FPS的速度运行),我们得到大约18k kbit

对于400x225视频,18k kbit/sec比特率超高。生成视频时我做错了什么?谢谢你的帮助,谢谢

为什么输出文件的大小如此之大?
-crf
允许您设置特定的质量。x264然后将应用适当数量的位以达到所需的质量。您使用的是几乎无损的
-crf 1
。这需要大量的位。CRF量表的对数范围为0到51。0是无损的,~18是视觉无损的,23是默认值,51是最高值和最差质量。所以
-crf 1
将比
-crf 18
大很多倍,即使你看不出有什么不同

我应该使用哪个
-crf
值? 使用提供可接受质量的最高
-crf
值,除非您有特殊需要或需要无损输出


有关更多信息和示例,请参见。

为什么
-crf 1
<代码>-crf 0是无损的,这会生成巨大的文件<代码>-crf 18大约是有损的,但“视觉无损”。使用提供可接受质量的最高值。
-crf
-b:v
是两种不同的“速率控制”方法,或者换句话说,它们确定如何分配位,从而控制质量和输出文件大小。它们是互斥的,因此如果您同时使用这两个选项,其中一个将被忽略。过度简化:
-crf
允许您设置质量,但不能保证文件大小,而
-b:v
允许您确定文件大小,但不能确定特定质量。如果你关心质量,为什么不给它原始的PNG文件呢
ffmpeg-framerate 35-i frame%05d.png-c copy output.mkv
或您是否有文件大小限制?有关
-crf
的详细信息,请访问。您试图实现的目标是什么?看来,这一讨论可能会成为许多关于解释x264速率控制方法的评论的来来回回,而无需解决实际的具体问题。如果你告诉我们你到底想做什么,我们可以给你一个适当的命令。是的,你可以同时使用“-r 35”和“-b:v 640k”。虽然我不知道你从哪里得到了640k(为什么不选择某种质量,让编码器选择比特率?)。带-b:v的1-pass不准确,也不是最佳质量(因为它必须猜测),并且对所有内容应用相同的比特率,即使它不需要。如果您绝对需要某个比特率(为什么?),则使用2次,如中所示。否则,只需像98%的其他用户一样使用-crf即可。
ffmpeg -r 35 -f image2 -i frame%05d.png -vcodec libx264 -crf 1 video.mp4