视频采集 (续)

原创 2006年06月02日 16:07:00

写的有点乱.....
还是要先看一下重要的数据结构struct videodev,这个自定义的数据结构描述了硬件如何采集视频信号,如何处理再传输到网络上的,由于篇幅,这里只列出重要的几项内容:
struct videodev
{
 int fd;                    /*打开设备文件返回的描述符*/
 char *videodevice ;
 struct video_mmap vmmap;                /*几个重要数据结构*/
 struct video_capability videocap;
 struct video_mbuf videombuf;
 struct video_picture videopict;
 struct video_window videowin;
 struct video_channel videochan;
 struct video_param videoparam; 

 unsigned char *pFramebuffer;                 /*内存影射后指向设备影射0地址指针*/

 unsigned char *ptframe[4];                   /*指向发送要发送到网络的数据指针数组*/
 int framelock[4];                            /*标示锁 0:可写入,1:不可写入*/

 pthread_mutex_t grabmutex;        /* 线程互斥锁*/

 int framesizeIn ;         /*frame*/
 int  formatIn;                                /*format of palette*/
 int bppIn;
 volatile int frame_cour;        /*标示正在传送的ptframe*/
 ..............
 }

$数据的采集
初始化 

      1.struct videodev *dev;
      2.将用户设定的format和depth写入dev->formatIn,bppIn中,bppIn的值有format值来决定;本 设计所使用的OV511芯片的摄像头,支持format = 15的格式,查一下videodev.h,15对应的是 VIDEO_PALETTE_YUV420P,对应的bppIn = 12;
      3.dev->fd = open (dev->videodevice, O_RDWR)),使用标准open函数打开设备;通过ioctl的参 数VIDIOCGCAP可以察看各项参数;
      4.通过VIDIOCGPICT获取struct video_picture参数,代码如下:
 ioctl (vd->fd, VIDIOCGPICT, &vd->videopict);
 printf ("VIDIOCGPICT brightnes=%d hue=%d color=%d contrast=%d whiteness=%d"
   "depth=%d palette=%d/n", dev->videopict.brightness,
   dev->videopict.hue, dev->videopict.colour, dev->videopict.contrast,
   dev->videopict.whiteness, dev->videopict.depth,
   dev->videopict.palette);
        5.修改struct video_picture中format和depth参数并保存设置:
 dev->videopict.palette = dev->formatIn;
   dev->videopict.depth = GetDepth (dev->formatIn);
   dev->bppIn = GetDepth (dev->formatIn);
   ioctl (dev->fd, VIDIOCSPICT, &dev->videopict);
   dev->framesizeIn = (dev->hdrwidth * dev->hdrheight * dev->bppIn) >> 3;
       6.memset (&(dev->videombuf), 0, sizeof (dev->videombuf)) 清空videombuf
       ioctl (dev->fd, VIDIOCGMBUF,&(dev->videombuf))  保存影射buffer准备采集,返回非0表示 设置成功默认采集第一次的数据放在buffer[0],下一次放在buffer[1];再一次buffer[0].....
       7.dev->pFramebuffer =
 (unsigned char *) mmap (0, dev->videombuf.size, PROT_READ | PROT_WRITE,
    MAP_SHARED, vd->fd, 0);
 mmap内存影射,影射区大小为videombuf.size,分了videombuf.frames块buffer,每块buffer大  小为videombuf.size/videombuf.frames,偏移量大小等于一块buffer的大小,pFramebuffer指  向内存影射区0地址;
      8.初始化时候采集数据填满2块buffer(本课题中videombuf.frames=2,硬件决定);
 for (f = 0; f < vd->videombuf.frames; f++)
 {
   vd->vmmap.frame = f;
   if (ioctl (vd->fd, VIDIOCMCAPTURE, &(vd->vmmap)))
     {
       perror ("cmcapture");
      }
 dev->vmmap.frame = 0;
 
采集

      1.ioctl (dev->fd, VIDIOCSYNC,&dev->vmmap.frame),frame同步,察看dev->vmmap.frame是否已 经采集完成。
      2.处理此frame数据:首先察看framelock[]是否被占用,如果可用则调用压缩算法函数处理ptFramebuffer指向的数据,将处理后的数据保存到ptframebuffer[]中,在这个过程中必须保证为互斥操作,调用线程互斥锁。
      3.采集数据:ioctl (dev->fd, VIDIOCMCAPTURE, &(dev->vmmap)
 dev->vmmap.frame = (dev->vmmap.frame + 1) % dev->videombuf.frames;
       dev->frame_cour = (dev->frame_cour +1) % OUTFRMNUMB;
 更新标示。


to be continue....................

iOS视频采集(四)

本篇在前面三篇的基础加入写入文件功能,代码见 MARK:-写入文件 注释(文中共有5处,一处设置 一处代理 三处写入步骤) 附:在真机设备中查看录制的音视频文件 Xcode windows -> ...
  • callzjy
  • callzjy
  • 2016年11月12日 21:44
  • 391

视频采集的基本流程

1、 视频采集的基本流程 一般的,视频采集都有如下流程: 2、 打开视频设备 在V4L2中,视频设备被看做一个文件。使用open函数打开这个设备: // 用非阻塞模式打开摄像头设备 ...
  • piaozhiye
  • piaozhiye
  • 2012年05月05日 13:44
  • 6712

windows 视频采集开源库

现在进行windows上视频采集,主要的库有 opencv  ffmpeg videoinpu
  • zwj61336190
  • zwj61336190
  • 2014年11月16日 06:51
  • 1225

编程珠玑及续笔记

15.2 最长重复子串#include #include using namespace std; const int MAXN=5000000; char c[MAXN],*a[MAXN];...
  • hz5034
  • hz5034
  • 2015年03月30日 10:22
  • 500

浅谈视频采集方案

现在手头上有一个项目就是需要优化采集方案。 我们这边之前使用的是作者Shiqi Yu写的开源代码,底层是基于DShow做的封装。但使用后发现采集到的视频流在进行回显时有点模糊,特别是文字部分。 现在通...
  • liuyi820729
  • liuyi820729
  • 2016年03月11日 10:43
  • 1194

【视频采集方案】

Android视频采集,传输,编码解码的方案总结  ipcamera-for-android 服务器 :    Android手机充当服务器,使用NanoHTTPD充当服务器 ...
  • u013378580
  • u013378580
  • 2017年05月25日 17:05
  • 1038

视频采集原理简介

视频(Video)是多幅静止图像(图像帧)与连续的音频信息在时间轴上同步运动的混合媒体,多帧图像随时间变化而产生运动感,因此视频也被称为运动图像。按照视频的存储与处理方式不同,可分为模拟视频和数字视频...
  • Andy20081251
  • Andy20081251
  • 2014年03月12日 10:48
  • 1417

用QT5实现视频采集

学习QT也有一段时间了,对QT稍有一点感觉,第一次自己写了一个相对有点用的程序,刚写完就献给广大热爱QT的好友,望你们参考,不对的地方请多多指教。QT5 的用法我就不说了,不会的看看其他的教程。 首...
  • SteveJobws
  • SteveJobws
  • 2017年02月11日 09:24
  • 459

C#视频采集方法对比

作者:王先荣 前言     随着Windows操作系统的不断演变,用于捕获视频的API接口也在进化,微软提供了VFW、DirectShow和MediaFoundation这三代接口。其中VFW早已...
  • yixiantian7
  • yixiantian7
  • 2014年01月20日 19:24
  • 3319

Qt开发:Qt+OpenCV在(Linux平台)PC上采集摄像头视频(源码奉送)

摄像头型号是环宇飞扬,普通的usb摄像头。运行环境是在linux上的,Opencv版本是2.1的。如果是windows下的qt开发环境,要么改下配置,要么照着源码写一下。在linux上运行是没有任何问...
  • yanzi1225627
  • yanzi1225627
  • 2013年04月08日 11:18
  • 12110
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:视频采集 (续)
举报原因:
原因补充:

(最多只允许输入30个字)