1、初始化
这是所有ffmpeg程序在程序初始化的时候做的(仅做一次),因为video4linux2是属于avdevice的范畴,所以需要额外地初始化一下:
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavdevice/avdevice.h>
int main () {
...
av_register_all ();
avdevice_register_all();
...
}
这个简单,就不解释了。
2、前期准备
按照《ffmpeg》一文中所说的,摄像头设备被当成了一个“文件”,其中只包含了视频流,但是我们同样可以用同一套方法对它解释。首先是打开设备,然后检查里面所支持的视频编码格式,然后设置解码参数,打开解码器,开始解码,得到一帧数据后转换,最后就得到你想要的格式。例如给QT使用的RGB24 :-)。
你需要准备 AVFormatContext, AVCodecContext, AVCodec, SwsContext 等变量以便后续操作。
AVFormatContext *fmtCtx = NULL;
AVFormatParameter inputFmtParameter;
AVCodecContext *decodeCtx;
AVCodec *decoder;
/* 获取这个输入设备的处理器,以便进行处理 */
AVInputFormat *inputFmt = av_find_input_format ("video4linux2");
if (inputFmt == NULL) {
/* 找不到这个“输入设备”,错误处理 */
}
/* 使用这个输入处理器“打开”一个文件。在Linux中,这自然是一视频设备的设备文件了 */
memset ( &inputFmtParameter, 0, sizeof(inputFmtParameter));
inputFmtParameter.height = 240;
inputFmtParameter.width = 320;
/*
* 在这里我们使用AVFormatParameter 这个结构,向输入处理器传递参数
* 这里向video4linux2 device传递“想要的”尺寸。设备会返回一个相近的能接受的尺寸。
* 你大可以什么都不传,只传NULL从而使用默认参数。
*/
if (av_open_input_file ( &fmtCtx, "/dev/video0", inputFmt,
sizeof(inputFmtParameter),&inputFmtParameter) < 0 ){
/* 打开“输入设备”失败,错误处理 */
}
3、What’s next?
本打算再写一遍,但是我想《ffmpeg》一文中,其实已经写得非常清楚了,在以上的步骤完成后,就可以像《ffmpeg》一文中处理一般文件的情况去处理摄像头数据了!