用山寨采集卡转移 Hi8 磁带录像机里的视频

目的就不多说了,把几年前录在 Hi8 磁带上的视频导入到电脑里。录像机是 SONY 的 CCD-TR728E ,十多年前产的东西了,除了仿皮的带子烂了以外包括电池等配件在内的所有部分均功能良好,这质量实在大赞。录像机的输出只有 CVBS 跟 S-Video 。用到的山寨采集卡是 EasyCAP DC60 ,大约 ¥50 的东西,做工一般,功能大部分正常,可惜 S-Video 的线断了,只能用画质稍微差一点的 CVBS 了。LinuxTV Project 上有这款山寨卡的详细介绍,里面是 Syntek 的 USB Webcam 主控 STK1160 ,仕兰半导体兼容 SAA7113 的 SC8113 四路模拟前端(所以有些卡是四路输入的),以及 VIA 的 AC’97 声卡芯片 VT1216A 。

首先我们需要准备些软件。假定你在使用 ubuntu :

sudo apt-get install build-essential linux-headers-generic git mencoder audacity

然后去获取 stk1160 驱动的源码,并编译安装(这个驱动会内建在 3.7 版本以后的内核中):

git clone git://github.com/ezequielgarcia/stk1160-standalone
make
sudo make install

接着删掉系统中的 easycap 驱动(这玩意不太稳定,会和 stk1160 冲突,并且以后会被取代,所以不用手软):

sudo rmmod easycap
sudo rm -r /lib/modules/`uname -r`/kernel/drivers/staging/media/easycap

最后载入 stk1160 驱动,插上采集卡,看看是否正常工作了,软件部分的准备就完成了:

sudo modprobe stk1160
dmesg | tail -20

下面开始干活。拔下采集卡,连接录像机的 CVBS 与音频输出和采集卡的 CVBS 与音频输入,然后在重新插入采集卡。接着,输入以下命令:

amixer -c stk1160mixer sset Line unmute cap

这条命令会取消采集卡音频输入的静音,否则你是不会录到任何声音的。然后用以下命令看看效果:

mplayer tv:// -tv driver=v4l2:norm=PAL:width=720:height=576:outfmt=uyvy:device=/dev/video1:input=0:alsa:adevice=hw.3:audiorate=32000:forceaudio:immediatemode=0

这里要说明一下,“ /dev/video1 ”为采集卡对应的设备(机器里面还有个 Webcam 占着 /dev/video0 ),录像机的输出为 PAL-M 格式( 720 × 576i @ 50fps ),“ input=0 ”这个参数指定了采集 CVBS 的输入,如果你用的是 S-Video 则需要改成“ input=1 ”,如果采集卡有多路输入就要改成对应的路数。“ hw.3 ”对应的是 ALSA 的 Digital audio capture ,可以在 /proc/asound/devices 里查看。 Hi8 磁带录像机采用 32kHz 8bit 单声道的格式来录制音频,所以采样率选了 32kHz 。实际上这个卡跑到 48kHz 完全没问题。

一般 PAL 信号过来周围一圈都会有些乱七八糟的东西,于是尝试用 crop 滤镜将其裁掉:

mplayer tv:// -tv driver=v4l2:norm=PAL:width=720:height=576:outfmt=uyvy:device=/dev/video1:input=0:alsa:adevice=hw.3:audiorate=32000:forceaudio:immediatemode=0 -vf crop=700:560:8:4

请自行调整“ crop=700:560:8:4 ”中的四个参数直到满意。前两个定义了图像区域的宽和高,后两个则定义了图像区域的坐标,若省略则默认相对于原图像居中。

最后,我们要开始录制了。将录像机的带子倒到最开始的地方,准备好大约 10GB 的剩余磁盘空间(每小时的视频大约需要 5GB ,一卷带子在 SP 模式下可以有一个半小时,LP 模式下更是可以长达 180 分钟,自己看着办吧),然后:

amixer -c stk1160mixer sset Line unmute cap
mencoder tv:// -tv driver=v4l2:norm=PAL:width=720:height=576:outfmt=uyvy:device=/dev/video1:input=0:alsa:adevice=hw.3:audiorate=32000:forceaudio:immediatemode=0 -vf crop=700:560:8:4 -ovc xvid -xvidencopts turbo:vhq=0:fixed_quant=3:threads=2 -srate 32000 -oac pcm -o 1.avi

为了节省空间,这里把采集到的视频实时压缩成了 MPEG-4 ASP 编码格式,即“ DivX ”。XviD 编码器的参数详见这里。这样的参数在我的 Core-i5 430M 的机器上可以保证不丢帧。如果出现了缓冲区满导致的丢帧的话,可能就要尝试一些更简单的算法比如 Motion JPEG 了。之所以用 mencoder 而不用 ffmpeg 是因为 ffmpeg 对 V4L 的支持不大好,拿来录摄像头的视频问题不大,而拿来录采集卡的视频就会出现采集格式无法设置、遇到不完全帧后卡死的状况。在采集模拟视频时出现不完全帧是很正常的,尤其是在磁带录制的时候磁头不大干净然后又放置了八年多的情况下。所以 ffmpeg 在这种情况下变得几乎无法使用。

当摄像机放完一盘磁带后你需要及时按下 Ctrl + C 来终止采集。

录制完以后会发现这个采集卡有个问题,音频部分有啪啪啪的声音。我们把音频分离出来看看是怎么回事:

ffmpeg -i 1.avi -vn -acodec copy 1.wav
audacity 1.wav

结果令人感到蛋疼,这山寨采集卡的声卡不知是出了什么毛病,虽然我只接了一个声道,但是数字输出却在两个声道间来回窜,如下图:

这到底是闹哪样啊!不过解决办法是有的,可以 downmix 一下。单击音轨左上方的箭头,从菜单里选择“分割立体声音轨到单声”:

然后从“文件”菜单中选择“导出……”,以 MS Wave 格式保存即可:

这样处理后啪啪啪的声音就基本消除了。不过如果你的录像机输出的是立体声的话,你可能得用电脑本身的声卡来做音频的同步采集了。此时你需要一条额外的音频电缆(一般是 RCA 母转 3.5mm ),然后在采集前不要用 amixer 把采集卡的音频 unmute 掉。

最后,把处理过的音频和原视频合在一起,顺便把视频用 MPEG-4 AVC ( H.264 )压缩一下以便能节省大约一半的体积:

ffmpeg -an -i 1.avi -i 1.wav -vcodec libx264 -threads 4 -cqp 25 -nr 500 -acodec libvo_aacenc -ab 64k 1.mp4
rm 1.avi 1.wav

命令中的“ -cqp 25 ”指定了质量,值越大,生成的文件越小,质量也越差,推荐的取值范围在 20 到 30 之间。“ -nr 500 ”则打开了降噪,参数从 100 到 5000 不等,毕竟老式前照式 CCD 在夜间那叫一个惨不忍睹。

最终你就得到了一个 H.264 编码的 MP4 视频文件,其质量接近 DVD,体积也是大到吓死人,于是采集到此结束。隔行扫描的视频最后会有些锯齿感,这也是没办法的事情╮<(=╯-╰=)>╭

最后的最后,附上一小段样本(为了控制体积做了进一步压缩,细节有些损失):

stk1160-sample


更新:

隔行扫描的锯齿可以用 yadif 滤镜消除。另外除了 cqp 以外 x264 还提供新的 crf 参数,压制出的文件体积更加优化。

ffmpeg -an -i 1.avi -i 1.wav -vf yadif -vcodec libx264 -threads 4 -crf 25 -nr 500 -acodec libvo_aacenc -ab 64k 1.mp4

如果需要使用 stk1160 采集卡的 S-Video 输入(实测清晰度比 CVBS 稍好,场行同步也要好很多)的话,需要 stk1160 驱动的一个特殊的 branch ,详见:http://easycap.blogspot.com/2012/10/stk1160-news.html

发表评论

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