生而自由

自由而无用的灵魂

FFMPEG系列之一:打开摄像头

最近陆陆续续接触到了不少视频相关的知识,终于有时间可以把这些知识整理一下了。

技术选型先看的是OpenCV(之前博文也有提到OpenCV的编译),在OpenCV下打开摄像头、录制成一个视频文件的代码是非常简单的,下面的代码演示了打开系统的第1个摄像头,并将画面录制为H264视频的过程(代码是从之前的测试代码中提取出来的,不保证没有错误,可能含无用代码):

但是简单归简单,其实OpenCV视频相关的功能也是在FFMPEG的基础上进行了封装,而且封装后可以控制的东西就变少了,尤其是现在要求在录制的同时有实时预览,OpenCV倒是可以预览摄像头画面,但是似乎同时就无法进行视频编码了--这个没有深研过,总之评估下来在项目中使用OpenCV是不太合适的。另外使用OpenCV从摄像头获取图像并显示的示例代码如下:

 

因此开始改看FFMPEG了,现在回头来看,过程真是极其痛苦的。视频的领域知识比较深;FFMPEG文档又比较少且纯C的API新手看起来既复杂又生涩,而且网上有关FFMPEG的资料大多数都是直接使用FFMPEG的命令行工具的、用FFMPEG库做开发的比较少,中文资料就更少了,基本只有CSDN的雷霄骅博士--大家都称作雷博--在写,但是刚看他的博客不久,忽然有一天惊闻他去世的消息,唉,一路走好。

雷博这里有一篇FFMPEG编码入门的文章:http://blog.csdn.net/leixiaohua1020/article/details/15811977/ ,可以作为入门的基础。FFMPEG开发库如果想在Windows下编译是非常麻烦的,mingw、各种依赖、路径问题,所以最好直接下载官方推荐的编译好的库:http://ffmpeg.zeranoe.com/builds/ ,做开发dev版(含.h、lib文件)、shared版(含dll动态链接库)都要下载。另外我的这系列文章,使用的都是2.8.6版本,现在已经到3.x版本了,API有了比较大的变化,这点需要注意。

言归正传,FFMPEG库下载好后,在项目中设置好头文件include和库lib,就可以开始编码了,下面直接给出FFMPEG从指定摄像头获取AVFrame的示例代码,注意代码只是API使用示例,不一定跑得起来。

 

最后需要注意一点,虽然可以从输入流中获取到帧率,但实际上摄像头输入的帧率是不固定的,比如环境光线越暗,CMOS需要的曝光时间就越长,相应的帧率也就会随之降低,如果需要获得固定的输入帧率,就需要就是插帧或者抛弃多余帧了。

附参考文档:

http://blog.csdn.net/nonmarking/article/details/48022387

点赞

发表评论

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