您的位置:首页 > 运维架构 > Linux

Voip程序中,视频采集的步骤

2010-11-12 14:00 351 查看
Voip程序中,视频采集的步骤
视频采集用的是Video4Linux接口
Video4linux2(简称V4L2),是linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下

(1).打开设备
Open(/dev/video0, O_RDWR | O_NONBLOCK, 0)
(2).取得设备的capability,看看设备具有什么功能
struct v4l2_capability cap;
struct v4l2_cropcap cropcap;
xioctl(capture_fd, VIDIOC_QUERYCAP, &cap)
xioctl(capture_fd, VIDIOC_CROPCAP, &cropcap)
(3).设置设备属性
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c = cropcap.defrect;
xioctl(capture_fd, VIDIOC_S_CROP, &crop)
(4)设置获取图像的宽高以及格式(YUV)
struct v4l2_format fmt;
memset(&fmt, 0, sizeof(fmt));

fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

fmt.fmt.pix.width = CAPTURE_WIDTH;
fmt.fmt.pix.height = CAPTURE_HEIGHT;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;//V4L2_PIX_FMT_YUYV
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
xioctl(capture_fd, VIDIOC_S_FMT, &fmt)
(5)向驱动申请帧缓冲
struct v4l2_requestbuffers req;
memset(&req, 0, sizeof(req));

req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
xioctl(capture_fd, VIDIOC_REQBUFS, &req)
(6)将申请得到的数据缓存转换成物理地址
struct v4l2_buffer buf;

memset(&buf, 0, sizeof(buf));

buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = capture_buffers;
xioctl(capture_fd, VIDIOC_QUERYBUF, &buf)
(7)mmap
st_mmap_buffers[capture_buffers].length = buf.length;
st_mmap_buffers[capture_buffers].start =
mmap(NULL /* start anywhere */,
buf.length,
PROT_READ | PROT_WRITE /* required */,
MAP_SHARED /* recommended */,
capture_fd, buf.m.offset);
(8)将申请到的帧缓冲全部入队列,以便存放采集到的数据
for (i = 0; i
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  video struct buffer linux null