rh9 实现视频的捕获

rh9 环境下实现linux视频的捕获,并存为bmp格式。
推荐阅读:《Linux系统下USB摄像头驱动开发》  《linux声音设备编程实例

/****************************************************/

/*                                                  */

/*                      v4lgrab.h                   */

/*                                                  */

/****************************************************/

 

#ifndef __V4LGRAB_H__

#define __V4LGRAB_H__

 

#include <stdio.h>

 

//typedef enum { FALSE = 0, TRUE = 1, OK = 2} BOOL;

 

//#define SWAP_HL_WORD(x) {(x) = ((x)<<8) | ((x)>>8);}

//#define SWAP_HL_DWORD(x) {(x) = ((x)<<24) | ((x)>>24) | (((x)&0xff0000)>>8) | (((x)&0xff00)<<8);}

 

#define  FREE(x)       if((x)){free((x));(x)=NULL;}

 

typedef unsigned char  BYTE;

typedef unsigned short WORD;

typedef unsigned long  DWORD;

/*

#pragma pack(1)

typedef struct tagBITMAPFILEHEADER{

     WORD bfType;                // the flag of bmp, value is "BM"

     DWORD    bfSize;                // size BMP file ,unit is bytes

     DWORD    bfReserved;            // 0

     DWORD    bfOffBits;             // must be 54

}BITMAPFILEHEADER;

 

typedef struct tagBITMAPINFOHEADER{

     DWORD    biSize;                // must be 0x28

     DWORD    biWidth;           //

     DWORD    biHeight;          //

     WORD biPlanes;          // must be 1

     WORD biBitCount;            //

     DWORD    biCompression;         //

     DWORD    biSizeImage;       //

     DWORD    biXPelsPerMeter;   //

     DWORD    biYPelsPerMeter;   //

     DWORD    biClrUsed;             //

     DWORD    biClrImportant;        //

}BITMAPINFOHEADER;

 

 

typedef struct tagRGBQUAD{

     BYTE    rgbBlue;

     BYTE rgbGreen;

     BYTE rgbRed;

     BYTE rgbReserved;

}RGBQUAD;

*/

 

#if defined(__cplusplus)

extern "C" {     /* Make sure we have C-declarations in C++ programs */

#endif

 

//if successful return 1,or else return 0

int openVideo();

int closeVideo();

 

//data 用来存储数据的空间, size空间大小

void getVideoData(unsigned char *data, int size);

 

#if defined(__cplusplus)

}

#endif

 

#endif //__V4LGRAB_H___

 

 

 

/****************************************************/

/*                                                  */

/*                      v4lgrab.c                   */

/*                                                  */

/****************************************************/

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

#include <sys/ioctl.h>

#include <stdlib.h>

 

#include <linux/types.h>

#include <linux/videodev.h>

 

#include "v4lgrab.h"

 

#define  TRUE     1

#define  FALSE         0

 

#define WIDTHBYTES(i)  ((i+31)/32*4)

#define FILE_VIDEO "/dev/video0"

//#define BMP      "image.bmp"

#define  IMAGEWIDTH    176

#define  IMAGEHEIGHT   144

 

static   int      fd;

static   struct   video_capability   cap;

static   struct   video_window       win;

static   struct   video_picture      vpic;

 

 

int openVideo()

{

     //Open video device

     fd = open(FILE_VIDEO, O_RDONLY);

     if (fd < 0) {

         perror(FILE_VIDEO);

         return (FALSE);

     }

 

     //Get capabilities

     if (ioctl(fd, VIDIOCGCAP, &cap) < 0) {

         perror("VIDIOGCAP");

         printf("(" FILE_VIDEO " not a video4linux device?)/n");

         close(fd);

         return (FALSE);

     }

 

     //Get the video overlay window

     if (ioctl(fd, VIDIOCGWIN, &win) < 0) {

         perror("VIDIOCGWIN");

         close(fd);

         return (FALSE);

     }

 

     //Set the video overlay window

     win.width = IMAGEWIDTH;

     win.height = IMAGEHEIGHT;

     if(ioctl(fd, VIDIOCSWIN, &win) <0) {

         perror("VIDIOCSWIN");

         close(fd);

         return (FALSE);;

     }

 

     //Get picture properties

     if (ioctl(fd, VIDIOCGPICT, &vpic) < 0) {

         perror("VIDIOCGPICT");

         close(fd);

         return (FALSE);

     }

 

 

//   if (cap.type & VID_TYPE_MONOCHROME) {    

//   } else {

     vpic.depth=24;

     vpic.palette=VIDEO_PALETTE_RGB24;

 

     if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) {

         printf("Unable to find a supported capture format./n");

         return (FALSE);

     }

//   }

 

     return (TRUE);

}

 

int closeVideo()

{

     if(fd != -1) {

         close(fd);

         return (TRUE);

     }

     return (FALSE);

}

 

void getVideoData(unsigned char *data, int size)

{

     size = read(fd, data, size);

}

/*

int main(int argc, char ** argv)

{

     FILE *             fp;

    

     BITMAPFILEHEADER   bf;

     BITMAPINFOHEADER   bi;

 

     unsigned char *        buffer;

     int           i;

    

     fp = fopen(BMP, "wb");

     if(!fp){

         perror(BMP);

         exit(1);

     }

 

     if(openVideo() == FALSE) {

         return(-1);

     }

    

 

     //Set BITMAPINFOHEADER

     bi.biSize = 40;

     bi.biWidth = win.width;

     bi.biHeight = win.height;

     bi.biPlanes = 1;

     bi.biBitCount = 24;

     bi.biCompression = 0;

     bi.biSizeImage = WIDTHBYTES(bi.biWidth * bi.biBitCount) * bi.biHeight;

     bi.biXPelsPerMeter = 0;

     bi.biYPelsPerMeter = 0;

     bi.biClrUsed = 0;

     bi.biClrImportant = 0;

 

     //Set BITMAPFILEHEADER

     bf.bfType = 0x4d42;

     bf.bfSize = 54 + bi.biSizeImage;

     bf.bfReserved = 0;

     bf.bfOffBits = 54;

 

 

     buffer = malloc(bi.biSizeImage);

     if (!buffer) {

         printf("Out of memory./n");

         exit(1);

     }

 

     for(i=0; i<20; i++)

         getVideoData(buffer, bi.biSizeImage);

 

     fwrite(&bf, 14, 1, fp);

     fwrite(&bi, 40, 1, fp);

     fwrite(buffer, bi.biSizeImage, 1, fp);

    

     printf("get bmp form video/t[OK]/n");

   

     fclose(fp);

     closeVideo();

     return 0;

}

*/

 <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
上一篇:《 文件和设备编程
下一篇:《 解析linux内核获取当前进程指针的方法

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
为了设计一个基于高云FPGA的多路网络视频监控编码系统,你需要深入理解FPGA的可编程特性和网络视频监控系统的运作原理。首先,建议仔细研究《全国大学生FPGA设计竞赛:多路网络视频监控编码系统》这本书,它将为你提供宝贵的设计思路和实践经验。 参考资源链接:[全国大学生FPGA设计竞赛:多路网络视频监控编码系统](https://wenku.youkuaiyun.com/doc/2zbg9rh012?spm=1055.2569.3001.10343) 设计步骤如下: 1. 需求分析:确定监控系统需要支持的视频流数量、分辨率、帧率等关键参数,以及编码标准(如H.264/H.265)和网络传输协议(如RTSP/RTP)。 2. 硬件选择:选择合适的高云FPGA型号,考虑其逻辑单元数量、内存大小、I/O接口等是否满足多路视频处理的需求。 3. 系统架构设计:设计包括视频捕获、编码、网络传输和解码显示等模块的系统架构。确保系统模块之间高效配合,减少数据传输延迟。 4. 视频捕获模块实现:利用FPGA的并行处理能力,设计视频捕获模块,这可能涉及到模拟视频信号的数字化、数字视频信号的串行接收等。 5. 视频编码模块实现:编写或集成现有的视频编码IP核,实现高效的视频压缩。考虑使用硬件描述语言如VHDL或Verilog进行编码优化。 6. 网络传输模块实现:设计网络接口模块,实现视频数据的打包、传输和接收。可能需要使用MAC层、TCP/IP协议栈等IP核。 7. 视频解码和显示模块实现:设计视频解码模块,将压缩后的视频数据解码还原成可视的视频信号。在FPGA上实现显示控制逻辑,将视频显示在屏幕上。 8. 调试和优化:使用仿真工具进行模块级和系统级的仿真测试,验证设计的正确性。在实际硬件上进行调试,优化系统性能和稳定性。 关键考虑因素: - 实时性:保证视频数据能够实时处理并传输,避免出现严重的延迟或丢包现象。 - 并发处理能力:针对多路视频流处理,设计高效的并行架构,确保系统能够同时处理多个视频流。 - 系统资源利用:合理规划FPGA内部的逻辑资源、存储资源和IO资源,避免资源浪费或不足。 - 可扩展性和可维护性:设计时考虑未来可能的功能扩展或维护,保证代码的可读性和模块化设计。 在完成设计后,进行系统集成和测试,确保整体功能和性能达标。推荐参考《全国大学生FPGA设计竞赛:多路网络视频监控编码系统》,它不仅会指导你完成当前的设计任务,还能帮助你深化对相关技术的理解,为未来在计算机科学领域的深入研究打下坚实基础。 参考资源链接:[全国大学生FPGA设计竞赛:多路网络视频监控编码系统](https://wenku.youkuaiyun.com/doc/2zbg9rh012?spm=1055.2569.3001.10343)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值