我一直在尝试使用FFmpeg的X11grab模块录制截屏视频,到目前为止,它已经或多或少地工作了。我知道a / v编码是一个复杂的过程,有很多细节,但我正在尽力学习。
我想对视频流进行“轻量级”录制,在录制流时,尽可能减少系统压力。我用pacat和sox分别录制了两个音频流。之后,整个过程被过滤,规范化,编码并组合成Matroska容器。
现在,我正在ffmpeg记录一个rawvideo流,以便输入x264的yuv4 demuxer。我之前尝试过ffv1和直接x264录音。我的系统无法使用x264处理我想要的最终流的实时编码,因此我必须在录制完成后单独重新压缩。我发现ffv1给了我可怕的帧丢失,yuv4也是如此。我怀疑这是由于硬盘驱动器的速度,即使我坐在SATA3 Caviar Black中,它专门用于保存记录的数据。
问题是,我应该看一下视频编解码器的组合?在x264中直接录制并稍后重新压缩到“更好”的x264?原始视频,然后压缩?我将如何解决问题,例如我遇到的帧丢失问题?
编辑:这是我目前使用的ffmpeg行。
ffmpeg -v warning -f x11grab -s 1920x1080 -r 30000/1001 -i :0.0\
-vcodec rawvideo -pix_fmt yuv420p -s 1280x720\
-threads 0\
recvideo.y4m
答案 0 :(得分:3)
您是否尝试过http://en.wikipedia.org/wiki/Huffyuv?
您确定您的问题是CPU还是磁盘带宽?您尝试写入磁盘的数据速率是多少?在您的比特率和设置下,您的编解码器需要多少CPU?我假设你没有记录计算机闲置 - 它还有多少资源用于录制?
为了测试磁盘写入性能,只需分配100MB,从/dev/urandom
读取100MB,并在磁盘空闲时将缓冲区写入该磁盘上的文件。测量写入的时间(从urandom读取需要时间)。 Linux具有回写功能,这意味着它会每隔5秒将脏页刷新到磁盘,而不是在写入时立即刷新。使用fdatasync
(或完整fsync
)将为您提供数据在磁盘上的实时时间。
为什么你不能看到ffmpeg的cpu使用情况?如何录制显示top
的终端窗口的一分钟?如果没有,终端中的perf record -a sleep 60
如何,然后切换到您的操作,记录一分钟后跟perf report
?
编辑:我使用avconv -v warning -f x11grab -s 1680x1050 -r 30000/1001 -i :0.0 -vcodec ffvhuff -s 1280x720 -threads 0 capture.mkv
,它在RGB中录制效果很好。然后,您可以在YUV中离线转码为H.264,双通道以获得最高质量等。我的速度大约为24MB /秒,但它似乎是单线程的。我的Core2 @ 2.3Ghz很好用。