• 大小: 18KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: 其他
  • 标签: v4l2  

资源简介

参考博客地址:http://blog.csdn.net/fendoubasaonian 环境: 1、一个支持MJPG格式的usb摄像头 2、支持V4L2的linux环境 实现: 1、从摄像头读取一帧MJPG图片 2、将MJPG图片保存到本地

资源截图

代码片段和文件信息

/*
 *  V4L2 video capture example
 *
 *  This program can be used and distributed without restrictions.
 */

#include 
#include 
#include 
#include 


#include              /* getopt_long() */

#include               /* low-level i/o */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include           /* for videodev2.h */

#include 

#define CLEAR(x) memset (&(x) 0 sizeof (x))

typedef enum {
        IO_METHOD_READ
        IO_METHOD_MMAP
        IO_METHOD_USERPTR
} io_method;

struct buffer {
        void *                  start;
        size_t                  length;
};

static char *           dev_name        = NULL;
static io_method        io              = IO_METHOD_MMAP;
static int              fd              = -1;
struct buffer *         buffers         = NULL;
static unsigned int     n_buffers       = 0;

static void errno_exit(const char * s)
{
        fprintf (stderr “%s error %d %s\n“
                 s errno strerror (errno));

        exit (EXIT_FAILURE);
}

static int xioctl(int fdint requestvoid * arg)
{
        int r;

        do r = ioctl (fd request arg);
        while (-1 == r && EINTR == errno);

        return r;
}

static void process_image(const void * p)
{
        fputc (‘.‘ stdout);
        fflush (stdout);
}

//从内核缓冲区取出一帧数据
static int read_frame(void)
{
//2015.12.12_18:33:zhou_add
// static int i = 0;
//end

        struct v4l2_buffer buf;
        unsigned int i;

        switch (io) 
{
        case IO_METHOD_READ:
                if (-1 == read (fd buffers[0].start buffers[0].length)) 
{
                        switch (errno) 
{
                        case EAGAIN:
                                return 0;

                        case EIO:
                                /* Could ignore EIO see spec. */

                                /* fall through */

                        default:
                                errno_exit (“read“);
                        }
                }

                process_image (buffers[0].start);


                break;

        case IO_METHOD_MMAP:
                CLEAR (buf);

                buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                buf.memory = V4L2_MEMORY_MMAP;
/*从内核环形缓冲区取出一帧数据*/
                if (-1 == xioctl (fd VIDIOC_DQBUF &buf)) {
                        switch (errno) {
                        case EAGAIN:
                                return 0;

                        case EIO:
                                /* Could ignore EIO see spec. */

                                /* fall through */

                        default:
    

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       20525  2015-12-13 20:08  v4l2.c
     文件       61593  2015-12-12 16:19  v4l2.h

评论

共有 条评论