FFmpeg屏幕录制:应该使用哪些编解码器?

3
我一直在尝试使用FFmpeg的X11grab模块录制屏幕视频,到目前为止效果还不错。我知道音视频编码是一个复杂的过程,有许多细节需要注意,但我正在努力学习。
我想要进行“轻量级”录制,即在录制时尽量减少对系统的压力。我分别使用pacat和sox录制两个音频流。稍后,整个音视频流将被过滤、归一化、编码并合并到Matroska容器中。
目前,我使用ffmpeg记录一个rawvideo流来提供给x264的yuv4解复用器。之前我也尝试过ffv1和纯粹的x264录制。但我的系统无法在我想要的最终设置下实时编码x264,所以我必须等录制完成后再重新压缩。我发现ffv1会导致严重的帧丢失,使用yuv4也会出现,但情况较轻。我怀疑这是由于硬盘速度引起的,即使我使用的是一个专门用来存储录制数据的SATA3 Caviar Black。
问题是,我应该考虑哪种视频编解码器的组合?直接使用x264录制并在后期重新压缩成“更好”的x264吗?先使用raw video再压缩?我该如何找出像我之前遇到的帧丢失问题的原因?
编辑:这是我目前使用的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

你的屏幕录制分辨率是多少? - Multimedia Mike
我正在以1080p记录整个屏幕,并实时缩放为720p。 - mkaito
https://trac.ffmpeg.org/wiki/StreamingGuide 提到了一些好的编解码器可供使用。 - rogerdpack
1个回答

3

你尝试过http://en.wikipedia.org/wiki/Huffyuv吗?

你确定问题是CPU还是磁盘带宽吗?你正在尝试写入磁盘的数据速率是多少?ffmpeg在你的比特率和设置下需要多少CPU?我假设你不会记录电脑处于空闲状态 - 它还剩下多少资源用于录制?

为了测试磁盘写入性能,只需分配100MB,从/dev/urandom读取100MB到其中,并将缓冲区写入该磁盘上的文件,同时磁盘处于空闲状态。测量写入所需的时间(从urandom读取需要时间)。Linux有writeback,这意味着它每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格式录制,并且效果很好。然后可以离线转码为H.264格式的YUV,双通道传输以获得最佳质量等。我得到了大约24MB /秒的速度,但它似乎是单线程的。我的Core2 @ 2.3Ghz可以胜任。


是的,我尝试过huffyuv。在录制过程中,我会将我的四个核心中的两个专门用于ffmpeg。此外,我的问题的一部分是关于确定我所遇到的问题,这意味着我不知道它是CPU还是HDD相关的。我也不确定如何找到写入磁盘使用的数据速率。 - mkaito
1
你正在将RGB(本机像素)转换为YUV。尝试以RGB格式录制。获取CPU使用情况应该像运行“top”(或“htop”,或从Linux工具运行“perf record -a sleep 60”)一样容易,同时进行录制。每秒字节的磁盘写入速率是您在一分钟内记录的文件大小除以60。磁盘应该能够以100MB / sec的速度写入(顺序地,如果它仅用于此目的并且不执行任何其他工作,包括读取,这会导致它寻找)。 - Z.T.
YUV4 不支持 (A)RGB 像素格式。x264 只接受原始 y4m 流,而且当使用 x264 时,ffmpeg 会自动选择 yuv420p。视频文件大小约为每分钟 2.30GB,这意味着它正在以大约 40Mb/s 的速度写入。htop 报告指定给 ffmpeg 的核心负载约为每个核心的 30%。 - mkaito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接