本来这一次准备写SPI的,但是因为读取SPI Flash的数值不正确,还在继续努力,所以就先不写SPI了,回头再写.这次先来说一下V4L2.
V4L2全称video for Linux 2,是Linux的新一代视频架构,刚买了一个USB摄像头,所以,这里试一下效果.买的这个摄像头只支持YUYV格式,也就是YUV422,我之前有一套代码是测试MJPEG的,我笔记本的摄像头是支持这种格式的,这里因为只支持YUYV,所以,代码稍微修改了一下,但是效果不是很好,代码后边有空了,再优化.
首先,在Ubuntu PC环境下,先来测试一下效果,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <getopt.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <asm/types.h>
#include <linux/videodev2.h>
#define CLEAR(x) memset (&(x), 0, sizeof (x))
struct buffer {
void * start;
size_t length;
};
static char *dev_name = "/dev/video1";//摄像头设备名
static int fd = -1;
struct buffer *buffers = NULL;
static unsigned int n_buffers = 0;
#define VIDEO_WIDTH 640
#define VIDEO_HEIGHT 480 // 分辨率600 * 480(VGA格式)
// 录制格式,笔记本摄像头可以选择V4L2_PIX_FMT_MJPEG,这样可以直接保存成jpg,直观
#define VIDEO_FORMAT V4L2_PIX_FMT_YUYV //V4L2_PIX_FMT_MJPEG
//V4L2_PIX_FMT_MJPEG
//V4L2_PIX_FMT_YUYV
//V4L2_PIX_FMT_YVU420
//V4L2_PIX_FMT_RGB32
FILE *file_fd;
#define CAPTURE_FILE "test.yuv"//"test.jpg" // 笔记本摄像头选择"test.jpg"
static unsigned long file_length;
//
//获取一帧数据
//从视频缓冲区的输出队列中取得一个已经保存有一帧视频数据的视频缓冲区
//
static int read_frame (void)
{
struct v4l2_buffer buf;
CLEAR (buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
if(ioctl (fd, VIDIOC_DQBUF, &buf) == -1)
{
printf("VIDIOC_DQBUF failture\n"); //出列采集的帧缓冲
exit(1);
}
assert (buf.index < n_buffers);
// printf ("buf.index dq is %d,\n",buf.index);
//将其写入文件中
fwrite(buffers[buf.index].start, buffers[buf.index].length, 1, file_fd);
printf("Capture one frame saved in %s\n", CAPTURE_FILE);
//