返回

FFmpeg 屏幕录制文件大小变化的疑惑解答

Linux

揭秘 FFmpeg 屏幕录制文件大小变化之谜

问题:FFmpeg 屏幕录制文件大小为何在录制期间保持不变?

当你使用 FFmpeg 进行屏幕录制时,你可能会注意到一个奇怪的现象:目标 MP4 文件的大小在录制过程中保持不变。这可能会令人困惑,因为录制的视频正在增长,但文件大小却没有反映这一点。

解决方案:深入了解视频编码过程

要理解为什么文件大小不立即更新,我们需要深入了解视频编码过程。

帧捕捉:从屏幕捕获图像

屏幕录制从捕捉一系列图像帧开始,这些帧以每秒特定速率从屏幕获取。这些帧最初存储在系统内存中。

视频编码:压缩图像帧

接下来,FFmpeg 使用编解码器(例如 H.264、H.265 或 VP9)对这些帧进行编码。编解码器通过压缩原始帧来减小文件大小,同时保持视频的视觉质量。

文件增长:缓存帧以优化写入

编码后的帧不会立即写入目标 MP4 文件。相反,它们被缓存(存储)在内存中。这是为了优化写入过程,提高性能。

写入文件:当录制停止时更新文件大小

只有在 FFmpeg 命令终止或手动终止时,缓存的帧才会写入目标文件。这会导致文件大小在录制过程中保持不变,并在录制停止后才更新。

ls 命令:显示缓存数据,而不是实际文件大小

当你在 FFmpeg 录制期间使用 ls 命令检查文件大小时,它会显示缓存中的数据,而不是实际文件大小。因此,ls -lhrt 命令会始终显示 48 字节的大小。

文件增长示例

以下是 FFmpeg 屏幕录制期间文件大小变化的一个示例:

$ ffmpeg -f x11grab -s 1920x1080 -i :0.0 -c:v libx264 -crf 25 -t 10 output.mp4

$ ls -lhrt output.mp4
-rw-rw-r-- 1 user user 48B Jun  2 17:17 output.mp4

# 终止 ffmpeg 命令

$ ls -lhrt output.mp4
-rw-rw-r-- 1 user user 12.5MB Jun  2 17:17 output.mp4

如你所见,在命令运行期间,文件大小为 48 字节。只有在命令终止后,文件大小才会更新为 12.5MB,反映实际视频大小。

常见问题解答

1. 为什么文件大小不会立即更新?

文件大小不立即更新是为了优化写入过程,提高性能。

2. ls 命令为什么显示 48 字节?

ls 命令显示缓存中的数据,而不是实际文件大小。

3. 缓存帧如何改善性能?

缓存帧可以减少对磁盘的写入次数,提高写入速度。

4. 如何更改文件缓存?

你可以使用 -bufsize 选项调整 FFmpeg 的文件缓存大小。

5. 如何在录制期间查看实际文件大小?

在 FFmpeg 录制期间,你无法查看实际文件大小。只有在录制停止后,文件大小才会更新。