rh9 环境下实现linux视频的捕获,并存为bmp格式。
推荐阅读:《Linux系统下USB摄像头驱动开发》 《linux声音设备编程实例》
/****************************************************/ /* */ /* v4lgrab.h */ /* */ /****************************************************/ #ifndef __V4LGRAB_H__ #define __V4LGRAB_H__ #include //typedef enum { FALSE = 0, TRUE = 1, OK = 2} BOOL; //#define SWAP_HL_WORD(x) {(x) = ((x)<<8)>>8);} //#define SWAP_HL_DWORD(x) {(x) = ((x)<<24)>>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
#include
#include
#include
#include
#include
#include
#include
#include
#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 <>
perror(FILE_VIDEO);
return (FALSE);
}
//Get capabilities
if (ioctl(fd, VIDIOCGCAP, &cap) <>
perror("VIDIOGCAP");
printf("(" FILE_VIDEO " not a video4linux device?)\n");
close(fd);
return (FALSE);
}
//Get the video overlay window
if (ioctl(fd, VIDIOCGWIN, &win) <>
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) <>
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) <>
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;>
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;
}
*/
没有评论:
发表评论