还是成功拿到了备案,所以域名暂时不换了
中国网站备案的条条框框实在太多,而我的网站又有一些特殊,所以经过慎重考虑,决定放弃sunner.cn域名,改为sumoon.org。
从即日起,我的主页地址变更为:
http://sunner.sumoon.org
我的博客地址变更为:
http://blog.sumoon.org
sunner.cn域名及其子域被停止解析的时间未知。但我还是想继续为这个域名付费,等到那一天,不再需要如此繁琐的审查时,马上恢复使用。
还是成功拿到了备案,所以域名暂时不换了
中国网站备案的条条框框实在太多,而我的网站又有一些特殊,所以经过慎重考虑,决定放弃sunner.cn域名,改为sumoon.org。
从即日起,我的主页地址变更为:
http://sunner.sumoon.org
我的博客地址变更为:
http://blog.sumoon.org
sunner.cn域名及其子域被停止解析的时间未知。但我还是想继续为这个域名付费,等到那一天,不再需要如此繁琐的审查时,马上恢复使用。
某一天突然觉得,上课时直接用电脑自己把屏幕信息录下来,并同步录音,就能做出很不错的课程录像了,而且成本超级低。于是乎,折腾了一番。
因为我的操作系统课全程在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一类的网络文件系统,以最快的速度发布。每个教室里的教师机都应该考虑搞个类似的东西。
缺点:
LKM(Loadable Kernel Module)可以调用的内核函数及变量都列在/usr/src/linux-headers-xxxxxxxxx/Module.symvers里。有些资料说是在/proc/kallsyms里,这是不对的。kallsyms里列出的是内核中的各种符号,但并不是所有的符号都可以被LKM调用。如果使用了不可用的符号,insmod的时候会报错:Unknown symbol in module
如果想调用Module.symvers以外的内核函数,必须修改内核。找到该函数,在函数结束的“}”后加上一行:
EXPORT_SYMBOL(funcname); |
在LKM的源文件中,用extern声明一下该函数。如果这个函数是系统调用,在extern后面还要加上asmlinkage,否则参数不会正确传递。
一个工程有多个子目录。每个子目录下都有一个Makefile,将该子目录下的源代码编译为一个.o文件。根目录下的Makefile控制将这些.o链接到一起形成最终的执行文件。执行文件只依赖.o文件,对每个.o的处理规则都是进入其子目录然后make。这种布局会遇到一个问题,就是子目录里有源码的修改,根目录Makefile定义的依赖关系里检测不到,就不会重新编译。被这个问题困扰很久,今天看qt的Makefile,发现了一个很巧的解决方法。
subdir1/sub1.o: FORCE cd subdir1 && make subdir2/sub2.o: FORCE cd subdir2 && make FORCE: |
同样的方法用来安装Windows,硬件的相似度必备比较高才行。Linux貌似并不保存硬件信息,而是每次启动时重新检测。至少我这两台年龄相差6岁的机器没有半点儿相同的硬件。
在android源码的根目录下执行:
. build/envsetup.sh
可以获得下列非常方便的命令:
当我第一次获知它们的时候,内流满面啊……
用“help”命令可以获知更多……