Top大杂烩

本站启用域名:http://blog.csdn.net/fengyv

用户操作
[即时聊天] [发私信] [加为好友]
quanID:fengyv
239426次访问,排名290(1),好友46人,关注者64人。
开朗
fengyv的文章
原创 47 篇
翻译 0 篇
转载 95 篇
评论 38 篇
quan的公告





最近评论
Beidouxing456:good !!!!!
阅客:两年以后才看到这篇文章!了解
quan:直接设置 smb.conf 当然可以,但是从UI配置岂不是更简单
cctdbnj:设置了smb.conf中的netbios后就好了。
hylddhappy:说的不错,怎么没有块设备的啊!
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 rh9 实现视频的捕获收藏

    新一篇: 挑战IE的声音:Firefox到底好在哪里? | 旧一篇: 文件和设备编程

    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;

    }

    */

     
    上一篇:《文件和设备编程
    下一篇:《解析linux内核获取当前进程指针的方法

    发表于 @ 2006年04月28日 18:19:00|评论(loading...)|编辑

    新一篇: 挑战IE的声音:Firefox到底好在哪里? | 旧一篇: 文件和设备编程

    评论

    #linux 发表于2006-05-20 11:04:00  IP: 58.67.209.*
    rh下面也能捕获视频,哈哈,我还没试国呢,我要试试
    #dongbicheng1983 发表于2008-01-10 13:54:17  IP: 124.78.114.*
    good
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © quan