使用ffmpeg进行摄像头捕获

标签:
杂谈 |
分类: ffmpeg |
文章《Qt/Linux 下的摄像头捕获(Video4Linux2)》(以下简称《QT》中,我得到了很多读者的支持,为了回报大家以及开源社区,本文将叙述用ffmpeg进行摄像头捕获的方法。
有人很奇怪,ffmpeg不是用作解码、编码器的吗?怎么跟视频捕获扯上关系了?可以说,现在的ffmpeg,是一个强悍的多媒体库,在《QT》一文我阐述的获得摄像头数据的方法,仅为Linux专用,而且仅是video4linux2接口(当然可以通过v4l2-compact兼容层访问v4l1设备),另外又没有实现图像格式转换,确实非常的不好用。在这里,ffmpeg有以下优点:
- 支持几乎所有图像格式的转换,内置哦;
- 可以支持video4linux2,video4linux, vfw (windows下的哦)的视频采集;
- 还可以进行声音等的采集
当然,有一个缺点,就是其授权是GPLv2的(似乎现在可以升级到GPLv3了,但鄙人不是太明白v3和v2的区别),这对商业应用有所限制哦(话说腾讯因为QQ影音“非法”使用ffmpeg库而被加入Hall
of shame了吗?哈哈)。
言归正传,为了更清楚地了解这个过程,读者最好先阅读有关ffmpeg的资料。本站的《使用ffmpeg进行视频解码以及图像转换》(以下简称《ffmpeg》,也是比较好的入门。本文以video4linux2为例,介绍其使用方法。
1、初始化
这是所有ffmpeg程序在程序初始化的时候做的(仅做一次),因为video4linux2是属于avdevice的范畴,所以需要额外地初始化一下:
1 2 3 4 5 6 7 8 9 10 |
#include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libavdevice/avdevice.h> |
这个简单,就不解释了。
2、前期准备
按照《ffmpeg》一文中所说的,摄像头设备被当成了一个“文件”,其中只包含了视频流,但是我们同样可以用同一套方法对它解释。首先是打开设备,然后检查里面所支持的视频编码格式,然后设置解码参数,打开解码器,开始解码,得到一帧数据后转换,最后就得到你想要的格式。例如给QT使用的RGB24 http://blog.simophin.net/wp-includes/images/smilies/icon_smile.gif 。
你需要准备 AVFormatContext, AVCodecContext, AVCodec, SwsContext 等变量以便后续操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
AVFormatContext *fmtCtx = NULL; AVFormatParameter inputFmtParameter; AVCodecContext *decodeCtx; AVCodec *decoder; |
3、What’s next?
本打算再写一遍,但是我想《ffmpeg》一文中,其实已经写得非常清楚了,在以上的步骤完成后,就可以像《ffmpeg》一文中处理一般文件的情况去处理摄像头数据了!