歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

rh9實現linux視頻捕獲


rh9實現linux視頻捕獲   rh9 環境下實現linux視頻的捕獲,並存為bmp格式。   /****************************************************/ /*                                                  */ /*                      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 shortWORD; typedef unsigned long  DWORD; /*  www.2cto.com   #pragma pack(1) typedef struct tagBITMAPFILEHEADER{      WORDbfType;                // 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;          //      WORDbiPlanes;          // must be 1      WORDbiBitCount;            //      DWORD    biCompression;         //      DWORD    biSizeImage;       //      DWORD    biXPelsPerMeter;   //      DWORD    biYPelsPerMeter;   //      DWORD    biClrUsed;             //      DWORD    biClrImportant;        // }BITMAPINFOHEADER;   typedef struct tagRGBQUAD{      BYTE    rgbBlue;      BYTErgbGreen;      BYTErgbRed;      BYTErgbReserved; }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___    www.2cto.com   /****************************************************/ /*                                                  */ /*                      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() {  www.2cto.com        //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);      }  www.2cto.com   //   }        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);      }  www.2cto.com             //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; } */     作者 fengyv
Copyright © Linux教程網 All Rights Reserved