資源簡介
參考博客地址:http://blog.csdn.net/fendoubasaonian
環(huán)境:
1、一個支持MJPG格式的usb攝像頭
2、支持V4L2的linux環(huán)境
實現(xiàn):
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);
}
//從內(nèi)核緩沖區(qū)取出一幀數(shù)據(jù)
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;
/*從內(nèi)核環(huán)形緩沖區(qū)取出一幀數(shù)據(jù)*/
????????????????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
評論
共有 條評論