我正在尝试使用ffmpeg使用以下命令:
ffmpeg -f x11grab -s 1366x768 -framerate 30 -i :0.0 -c:v libx264 -b:v 1000k out.mp4
我从中学到这里。
但我无法理解framerate
这个上下文中的意思。
以下是我思考:
如果我们将存储在目录中的一组图像转换为视频,如上所述这里,帧速率30
意味着 -“在视频的第一秒显示前 30 张图像,在下一秒显示接下来的 30 张图像,依此类推,直到显示完所有图像”到目前为止
的例子,如果我们有 90 张图像,那么生成的视频的长度将是 3 秒。
同样,在屏幕录制期间,应该发生以下情况:
假设我的屏幕刷新率为 60 Hz,每秒会生成 60 张图像并存储在缓冲区中。
但是,由于ffmpeg
已指定帧速率为 30,因此它会从缓冲区中获取前 30 张图像(图像 #1 - #30)并生成 1 秒的视频,然后获取图像 #31 - #60 并生成下一秒的视频。
这意味着,在 1 秒的录制过程中,将生成 2 秒的视频。
为了验证这个理论,我进行了以下实验:
我在屏幕上运行了一个图形秒表,让它精确运行 10 秒,同时记录秒表从 1 到 10 的运行。
根据我的理论,要么制作的视频应该有 20 秒,并显示从 1 到 10 的完整秒表计数,或者,使视频时间与录制时间保持相等,ffmpeg将会生成一段 10 秒的视频,并且只显示从 1 到 5 的秒表计数的一半(前 30*10 = 300 帧,而显卡在同一时间内生成的总共 600 帧)。
但上述两种情况都没有发生,视频长度为10秒,内容和录屏时画面一模一样,都是秒表从1到10的计数。
我使用帧速率 10 而不是 30 重复了相同的实验,发现了相同的结果,即视频长度为 10 秒并且秒表计数从 1 到 10。
那么我的理论到底有什么问题?
我能想到的并且与我的观察一致的其他理论是:
自从,ffmpeg假设输入流为 60 Hz,则必须以 30 的帧速率进行录制,在视频制作过程中它会跳过其他所有图像。
也就是说,它使用图像 #1、#3、#5 ... #60 来制作 1 秒的视频。
但我不确定这是否正确。
我的系统配置:
操作系统:Ubuntu 16.04
ffmpeg 版本:
ffmpeg version 2.8.6-1ubuntu2 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.3.1 (Ubuntu 5.3.1-11ubuntu1) 20160311 configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60.100 / 56. 60.100 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40.101 / 5. 40.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100
答案1
FFmpeg 是一个基于时间的媒体处理器,因此除非另有指示,否则它会努力保持输入的时间关系。
framerate
设备的选项设置x11grab
抓取帧率。如果每秒提供的帧数较少或较多,则 ffmpeg 将分别复制或删除差异部分。