在Linux下用ffmpeg自拍课程录像

某一天突然觉得,上课时直接用电脑自己把屏幕信息录下来,并同步录音,就能做出很不错的课程录像了,而且成本超级低。于是乎,折腾了一番。

因为我的操作系统课全程在Linux下放幻灯片、做演示,所以当然就寻找Linux下的解决方案。

首先试验了xvidcap,它支持命令行和图形界面两种方式,能同步录音和录像,支持多种编码,2006年开始停止更新。最先遇到的问题是不能录音,几经周折发现只有在音频编码设为pcm16的时候才能录音。然后遇到的问题是不稳定,连续工作一会儿就segment fault。于是放弃。

然后试验了recordmydesktop,它是命令行的,有图形前端,能同步录像和录音,只支持ogv编码和格式,2008年停止更新。它的问题是编码器的CPU消耗太高,我把帧率设成1,才能正常地实时编码。它支持先无损压缩捕获,然后再编码的方式,但因为下课就得走人,没那么多时间给它。从它的源码里发现一个未公开的参数–no-encode,捕获完毕直接退出,以后可以用–rescue参数慢慢编码。看上去很美,但–rescue的结果就是segment fault。调了调代码,没搞定,于是放弃。

开始慨叹咋就没一个像windows下Camtasia那样好用的呢?又几经周折,居然发现ffmpeg就能录!而且几乎100%满足我的需求!下面的脚本就是干这个的:

#!/bin/sh
 
wait_til()
{
    CURRENT=$(date +%s)
    TARGET=$(date -d "$1" +%s)
 
    SECONDS=$(($TARGET - $CURRENT))
 
    if [ $SECONDS -lt 0 ]; then
        SECONDS=0
    fi
 
    sleep "$SECONDS"
}
 
WORKDIR=~/podcast
FILENAME=lecture_`date +%Y%m%d_%H%M`.mkv
 
if [ "$1" != "" ]; then
    wait_til $1
fi
 
cd $WORKDIR
ffmpeg -f alsa -ac 1 -i pulse -f x11grab -r 10 -s 1024x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -s 512x384 -threads 0 $FILENAME

将代码存为capscreen文件,赋予执行权限,然后在命令行输入capscreen命令就立刻开始录像了。录好的文件存放在~/podcast中,文件名是“class_日期_时间.mkv”。capscreen后如果加上一个时间参数,就是等到该时刻才开始录像。比如“capscreen 8:00”就是早8点整开始。

这个脚本为了节约CPU资源(我上课用的是上网本,atom cpu,实在能力不足),设定的是图像无损压缩,音频不压缩,帧率10,屏幕分辨率1024×768,视频文件分辨率512×384。过后,可以再用ffmpeg重新编码,制作出适合各种情况的视频,详情请参考这里。如果CPU够劲,可以忽略后期过程,直接输出最终格式,再配合上传脚本,或者nfs、smb一类的网络文件系统,以最快的速度发布。每个教室里的教师机都应该考虑搞个类似的东西。

缺点:

  1. 鼠标指针始终都是一个箭头,而且不能隐藏。这个据说新版ffmpeg已经能处理了。懒得自己编译了,等ubuntu 10.10吧
  2. 不能融合摄像头,做出camtasia那样的画中画功能

在Linux下用ffmpeg自拍课程录像” 中有 2 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注