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
视频采集用的是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
相关文章推荐
- DM642视频采集程序注释
- DM642视频采集程序注释
- V4L2视频采集实现步骤
- v4l2视频采集程序
- 基于GTK的USB视频采集程序
- v4l2视频采集程序
- 基于GTK的USB视频采集程序
- VC++视频采集的步骤
- [转载] ffmpeg摄像头视频采集-采集步骤概述并采集一帧视频
- JMF在Win 7环境搭建及摄像头采集视频程序测试
- v4l2视频采集程序
- 使用DirectShow开发视频采集程序
- 关于Linux平台视频采集程序的修改
- ffmpeg摄像头视频采集(1)---采集步骤概述并采集一帧视频
- 采集视频,并在PC上显示出采集到的视频的程序
- V4L2视频采集实现步骤
- 一段基于linux V4L视频采集摄像程序的源码
- v4l2 视频采集流程程序
- 56.com视频采集接口程序(PHP)
- 明天回家啦,庆祝一下,贡献一段源码,基于linux V4L视频采集摄像程序