嵌入式视频采集编程思路(Video 4 Linux)-转

转自:http://zyg0227.blog.51cto.com/1043164/271954

1.  linux 内核有video for linux简称V4L。V4L是Linux影像系统与嵌入式影像的基础,是Linux kernel里支持影像设备的一组APIs,配合适当的视频采集卡与视频采集卡驱动程序,V4L可以实现影像采集、AM/FM无线广播、影像CODEC、频道切换等功能。目前,V4L主要应用在影像串流系统与嵌入式影像系统里,其应用范围相当广泛,例如:远程教学、远程医疗、视频会议、视频监控、可视电话等。V4L为2层式架构,最上层为V4L驱动程序,最下层则是影像设备驱动程序。

2. 接上USB摄像头,硬件设备在linux下都是作为文件访问,所以只需在/dev/下查找,一般情况下为video0。当摄像机通过USB接口连接到视频采集终端后,在程序中调用V4L APIs对设备文件video0的读操作即可实现摄像头视频数据采集。其主要过程如下:

1) 打开设备文件:

[cpp] view plain copy

  1. int v4l_open(char *dev, v4l_device *vd){};//打开影像源的设备文件;

2) 初始化picture:

[cpp] view plain copy

  1. int v4l_get_picture(v4l_device *vd){};// 获取输入的影像信息;

3) 初始化channel

[cpp] view plain copy

  1. int v4l_get_channels(v4l_device *vd){};// 获取每个channel的信息;

4) 对channel设置norm:

[cpp] view plain copy

  1. int v4l_set_norm(v4l_device *vd, int norm){};// 对所有的channel设置norm;

5) 设备地址映射

[cpp] view plain copy

  1. v4l_mmap_init(v4l_device *vd){};// 返回存放图像数据的地址;

6) 初始化mmap缓冲区:

[cpp] view plain copy

  1. int v4l_grab_init(v4l_device *vd, int width, int height){};

7) 视频捕获同步

[cpp] view plain copy

  1. int v4l_grab_sync(v4l_device *vd){};

8) 视频捕获:

[cpp] view plain copy

  1. int device_grab_frame(){}。

针对USB摄像头设备文件/dev/video0的视频采集程序流程,首先调用V4L_open()函数打开视频设备,设备文件开启成功后使用V4L_get_capability()读取设备信息,然后选择相应的视频采集方式进行视频采集并对采集的图像进行处理,最后调用V4L_close()函数关闭视频设备文件。其中的视频采集方式有两种,一种是read()直接读取方式,另外一种是mmap()内存映射方式。mmap()方式下进程之间通过映射同一个文件实现内存共享,各进程可以像访问普通内存一样对文件进行访问。此外,mmap()方式加速了I/O访问,提高了效率,故常选用内存映射方式获取视频。

Video for Linux支持的数据结构及其用途:

video_capability:设备的基本信息(设备名称、支持的分辨率等);

video_picture:采集的图像的各种属性;

video_channel:各个信号源的属性;

 video_windows:包含采集区域的信息;

video_mbuf:利用mmap映射的帧的信息;

video_mmap:用于mmap方式。  

通过以上操作,即可将摄像机视频数据采集到内存。采集到内存的视频数据既可采用文件的形式保存,也可将其压缩后通过网络发布到Internet。

时间: 2024-08-24 12:34:54

嵌入式视频采集编程思路(Video 4 Linux)-转的相关文章

Window 下 VFW 视频采集与显示

引言 经过几天的努力终于将VFW视频采集与显示功能完整实现了,不得不说网上对这方面完整的详细讲解文章是在太少了.所以就要本人来好好总结一下让后来者不再像我一样折腾好久.在本文中我将详细讲解VFW视频采集过程的实现,以及采集后视频的显示方法. VFW简介 虽然这是篇技术博文,但是我觉得用一个东西,那么关于它的概述还是不能少,所以特从百度上copy了下VFW的概念描述,如果读者不想看可以直接去观看正文部分. VFW(Video for Windows)是Microsoft推出的关于数字视频的一个软件

让OMCS支持更多的视频采集设备

有些OMCS用户在他的系统使用了特殊的视频采集卡作为视频源(如AV-878采集卡),虽然这些采集卡可以虚拟为一个摄像头,但有些视频采集卡需要依赖于自带了sdk才能正常地完成视频采集工作.在这种情况下,OMCS是不直接支持这些采集卡的.我们的思路是使OMCS具有自定义扩展的能力:我们让OMCS提供了扩展接口,让使用者可以向OMCS框架中注入其自己的视频采集程序.使用者要达到这种自定义的扩展相当简单,只需实现两个接口即可. 1.IVideoCapturer接口 OMCS.Engine.Video.I

用DirectShow实现视频采集-流程构建

DirectShow作为DirectX的一个子集,它为用户提供了强大.方便的多媒体开接口,并且它拥有直接操作硬件的能力,这使得它的效率远胜于用GDI等图形方式编写的多媒体程序.前面一篇文章已经对DirectShow作了粗略的介绍,阐述了它的原理及一些编程方法.这里结合实践中运用DirectShow实现视频采集(WIN32)来加深对DirectShow的理解和操作能力. 1.系统环境及开发环境 l       系统支持DirectX(Win 2K以上系统) l       VC++  6.0安装有

QT+OPENCV视频采集

今天终于有了自己的博客了!由于我的时间有限,又初来咋到,只好小试牛刀,写个简单的! Qt学习网站:http://www.yafeilinux.com/ OpenCV中文论坛:http://www.opencv.org.cn/index.PHP/Template:Code 首先介绍下opencv :OpenCV的全称是:Open Source Computer Vision Library.  OpenCV于1999年由Intel建立,现在由Willow Garage提供支持.OpenCV是一个基

Delphi XE6 试用Android视频采集

FMX支持视频采集,具体见FMX.Media,提供了很类支持音频.视频的处理. 按帮助文档,用Note3做了测试,结果,效率太低,不可用. 具体可查询帮助Video Capturing一节,我就是按这个把代码复制过来做的测试. 一点进展: 对于这么低的效率,经与朋友讨论,应该是FMX完全自己处理的结果,如此说来,如果我们能调用Android内置的相机进行录像,然后取得录像文件,该问题就解决了.这样想来,Delphi XE6支持的拍照功能,就是按这个原理实现的,非常适用了!为此,XE6带做一个St

手机Android音视频采集与直播推送,实现单兵、移动监控类应用

恰逢2014 Google I/O大会,不难看出安卓在Google的推进以及本身的开放性作用下,已经快延生到生活的各个方面了,从安卓智能手机.平板,到可穿戴的Android Ware.眼镜.手表.再到Android汽车.智能家居.电视,甚至最近看新闻,日本出的几款机器人都是Android系统的,再把目光放回监控行业,传统监控中的移动终端设备,例如:单兵设备.手持设备.车载终端设备,包括家庭监控中用到的智能设备,都可以用Android系统替代了,不仅开发容易,而且易扩展,设备也更加智能了. 图 -

嵌入式系统C编程之堆栈回溯

前言 在嵌入式系统C语言开发调试过程中,常会遇到各类异常情况.一般可按需添加打印信息,以便观察程序执行流或变量值是否异常.然而,打印操作会占用CPU时间,而且代码中添加过多打印信息时会显得很凌乱.此外,即使出错打印已非常详尽,但仍难以完全预防和处理段违例(Segment Violation)等错误.在没有外部调试器(如gdb server)可用或无法现场调试的情况下,若程序能在突发崩溃时自动输出函数的调用堆栈信息(即堆栈回溯),那么对于排错将会非常有用. 本文主要介绍嵌入式系统C语言编程中,发生

运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)> <运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析> <运维经验分享(五)-- 改进的java进程管

嵌入式系统C编程之堆栈回溯(二)

前言 本文作为<嵌入式系统C编程之堆栈回溯>的补充版.文中涉及的代码运行环境如下: 一  异常信号 信号就是软件中断,用于向正在运行的程序(进程)发送有关异步事件发生的信息.Linux应用程序发生异常时,操作系统会产生相应的信号.硬件检测到异常(非法指令.对无效的内存引用等)时也会通知内核,内核将其转换为适当的信号并发给该异常发生时正在运行的进程. 此外,进程可将信号发送给另一进程或进程组(调用kill函数),或向自身发送信号(调用raise函数). 系统中可产生并发送多种类型的信号.在Lin