使用ffmpeg进行摄像头捕获

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》一文中处理一般文件的情况去处理摄像头数据了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值