基于v4l2的视频监控

本文介绍了V4L2的历史及其在Linux内核中的应用,包括视频采集、输出、间隔消隐信号和收音机接口等。重点讨论了V4L2常用的命令标识符,如VIDIOC_REQBUFS、VIDIOC_STREAMON等,并提供了基于飞凌FL2440开发板的代码示例,用于摄像头到LCD的视频流传输。注意,实际应用时需根据设备节点和参数进行调整。
摘要由CSDN通过智能技术生成

1. v4l2简介:

V4L2有一段历史了。大约在1998的秋天,它的光芒第一次出现在Bill Dirks 的眼中。经过长足的发展,它于2002年11 月,发布2.5.46 时,融入了内核主干之中。然而直到今天,仍有一部分内核驱动不支持新的API,这种新旧API 的转换工作仍在进行。同时,V4L2 API也在发展,并在2.6.18 版本中进行了一些重大的改变。支持V4L2的应用依旧相对较少。V4L2在设计时,是要支持很多广泛的设备的,它们之中只有一部分在本质上是真正的视频设备:

可以支持多种设备,它可以有以下几种接口:
1. 视频采集接口(video capture interface):这种应用的设备可以是高频头或者摄像头.V4L2的最初设计就是应用于这种功能的.
2. 视频输出接口(video output interface):可以驱动计算机的外围视频图像设备--像可以输出电视信号格式的设备.
3. 直接传输视频接口(video overlay interface):它的主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU.
4. 视频间隔消隐信号接口(VBI interface):它可以使应用可以访问传输消隐期的视频信号.
5. 收音机接口(radio interface):可用来处理从AM或FM高频头设备接收来的音频流.

2. v4l2常用命令标识符

VIDIOC_REQBUFS:分配内存
VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址
VIDIOC_QUERYCAP:查询驱动功能
VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式
VIDIOC_S_FMT:设置当前驱动的频捕获格式
VIDIOC_G_FMT:读取当前驱动的频捕获格式
VIDIOC_TRY_FMT:验证当前驱动的显示格式
VIDIOC_CROPCAP:查询驱动的修剪能力
VIDIOC_S_CROP:设置视频信号的边框
VIDIOC_G_CROP:读取视频信号的边框
VIDIOC_QBUF:把数据放回缓存队列
VIDIOC_DQBUF:把数据从缓存中读取出来
VIDIOC_STREAMON:开始视频显示函数
VIDIOC_STREAMOFF:结束视频显示函数
VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。

废话少说,直接上代码吧哭

开发环境: 

   1. pc机: ubuntu-12.04

   2. 交叉编译工具: arm-linux-gcc

   3. 开发板: 飞凌FL2440

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <assert.h>  
#include <getopt.h>    
#include <fcntl.h>    
#include <unistd.h>  
#include <errno.h>  
#include <sys/stat.h>  
#include <sys/types.h>  
#include <sys/time.h>  
#include <sys/mman.h>  
#include <sys/ioctl.h>  
#include <asm/types.h>  
#include <linux/videodev2.h>  
#include <linux/fb.h>  
#define CLEAR(x) memset (&(x), 0, sizeof (x))   
    
struct buffer {   
    void * start;   
    size_t length;   
};   
    
static char * dev_name = NULL;   
static int fd = -1;   
struct buffer * buffers = NULL;   
static unsigned int n_buffers = 0;   
static int time_in_sec_capture=5;   
static int fbfd = -1;   
static struct fb_var_screeninfo vinfo;   
static struct fb_fix_screeninfo finfo;   
static char *fbp=NULL;   
static long screensize=0;   
    
    
    
inline int clip(int value, int min, int max) 
{   
    return (value > max ? max : value < min ? min : value);   
}   
  
 /*转换成图片显示在LCD上*/ 
static void process_
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值