在Windows下通过directshow录制屏幕的教程

http://www.acfun.tv/a/ac622949


这里介绍的是Windows下的屏幕录像方式.对于linux和mac党,请自行搜索关键字"ffmpeg X11",以上.

一句话介绍:注册录屏dshow滤镜(例如screen-capture-recorder或者uscreen capture),然后通过dshow获取录屏图像来压制,例如ffmpeg可以从dshow的对应滤镜获取录屏信息然后压制存在硬盘或者送给rtmp服务器,或者graphedit载入滤镜然后使用avs的dshowsource加载grf文件,送给压制程序压制.

如果上句话你能看懂或者通过google看懂,那么你就可以ctrl+W了.如果看不懂,那么请把这句话忘掉,然后把全文看完.

目前基佬们录屏所使用的主要工具就是Fraps或者Xspilt.但是这些工具经常容易出现rp问题,往往只能重来.而且Fraps只能录制出无损avi,对硬盘的体积和读写都是很大的伤害,Xspilt则只能录屏后接着送到rtmp服务器:这些工具都无法自己设置压制设置,无法获得更好的压缩比.

当然有的童鞋会提到vfw.问题是一来就算是vfw,有的程序也不一定支持vfw输出.二来MPEG B帧和AVI兼容性很差(http://forum.doom9.org/showthread.php?p=215654#post215654).vfw并不能作为最完美的解决方案.

而这里介绍的是通过DirectShow来自己完成屏幕的录制.

首先介绍一下DirectShow.DirectShow是DirectX的组件的一部分,是Windows提供的对于媒体文件的各种操作的一个通用接口,是VfW的"被"升级版.例如,我们可以直接通过DirectShow API来获取某个视频的解码流,从而送到播放器中供用户观看——目前绝大多数基于Windows的播放器默认的播放方式都是如此.作为对比我们来看一下跨平台的开源播放器mplayer,其解码方式是自行调用libav库,获得解码数据流和其它必需的信息之后显示给屏幕观看,解码过程中没有DirectShow接口的参与.

DirectShow基于模块化的方式进行设计.每一个组件都被称为一个Filter.例如,众所周知FFMpeg的库可以进行视频音频的分离解码前处理等工作,而于是我们就可以将其修改代码制作成一个FIlter.这样,当DirectShow接口获取要解码一个视频文件的请求的时候,DirectShow便可以调用这个Filter,获取需要的信息从而返回给发起请求的应用程序.顺便说下这个Filter就是著名的ffdshow项目.

而更重要的是,我们可以注册一个DirectShow Filter,获取其它的视频源信息,依旧可以通过DirectShow接口返回给需要的程序.比如,如果有一个DirectShow接口能够获得当前计算机屏幕上的动态图像信息并且作为视频流返回给DirectShow接口,那么只要我们有程序能够获得这段视频流,我们就能实现在Windows下的屏幕录制.

这是绝大多是基于WIndows的屏幕录制程序的原理,也是我们这里要使用的原理.

总结起来我们的屏幕录制方法基本原理如下:

注册用于屏幕录像的DirectShow滤镜,然后运行DirectShow滤镜获取屏幕动态图像,将获取到的动态图像流通过视频转换程序转换成需要的视频格式.

下面来介绍具体的方法.当然具体方法肯定不止一个也不止两个,喜欢玩的童鞋可以自己配置啦~

我们需要如下工具:

screen capture recorder

项目地址:https://github.com/rdp/screen-capture-recorder-to-video-windows-free

安装程序下载地址:https://sourceforge.net/projects/screencapturer/files

ffmpeg

项目地址:http://www.ffmpeg.org/

可执行程序下载地址:http://ffmpeg.zeranoe.com/builds/

第一步,安装screen capture recorder

安装过程十分简单,根据提示安装即可.如果安装失败,请去下载安装Java Runtime Environment

第二步是配置screen capture recorder.除去开始菜单中所自带的配置选项外,screen capture recorder的配置选项也可以在注册表的HKEY_CURRENT_USER/SOftware/screen-capture-recorder中找到.可以配置录制窗口大小,录制帧率等选项.


第二步下载ffmpeg.当然如果你之前就有ffmpeg并且你认为能够使用的话也可以跳过这步.

安装完毕后的screen capture recorder本身就自带有录屏功能,不过我们这里可以自己使用ffmpeg,自行配置一些选项.

下面是我所使用的ffmpeg命令:

ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -pix_fmt yuv420p -ar 48000 -vcodec libx264 -crf 23 -preset veryslow -x264opts b-adapt=2:bframes=0:aq-strength=1:psy-rd=0.8,0 -vsync vfr -acodec libvo_aacenc -f mpegts - | ffmpeg -f mpegts -i - -c copy -bsf:a aac_adtstoasc -f flv temp.flv

其中,"-f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer""是指定ffmpeg从dshow接口的两个滤镜中获得输入."-pix_fmt yuv420p"则是指定输出的颜色空间.录屏得到的视频颜色空间都是RGB的,而压制视频时需要将其转成YUV颜色空间.当然有的童鞋可能会开喷说rgb24转成yuv420根本没法看,但问题是请注意flash player只支持解码yuv420的视频,所以这是没有办法的事情撒~

这里我们选用了libx264和libvo_aacenc作为编码器.实际的压制参数我们可以根据实际的视频情况调整,这里列举的只是一个例子.像Fraps或者屏幕录像专家就无法自行选择编码器和压制参数,这就是使用dshow+ffmpeg自行录屏的优势所在.

最后第一个ffmpeg压制出来的数据流将会封装为mpeg TS格式然后传递给第二个ffmpeg.第二个ffmpeg接收此TS然后重新封装为flv.这样的处理方法在screen capture recorder自带的录屏选项中有,其主要目的是为了避免录下的视频出现过度的卡顿现象.

这样运行此命令后,ffmpeg会不断录制生成flv文件.当要结束录屏的时候,在命令行界面中按一下q,录屏就会停止,最终留下一个flv文件.

此外,由于ffmpeg支持librtmp,因此如果我们把最终输出的文件地址设置成rtmp服务器的地址的话,就可以将最终输出的flv数据流直接发送到rtmp服务器上,这样我们不需要Xspilt,就能变成生主啦~~~

这样screen capture recorder+ffmpeg的方法介绍完了.当然具体的方法肯定不止这一种.比如,dshow源滤镜就不止screen capture recorder这一种,uscreencapture也是可选的一种滤镜.此外,从dshow获取视频流的方法也不止ffmpeg这一种,GraphEdit+AVS的组合技也是可以的.

最后再来一个自己使用这种方法的录屏实例:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值