USB摄像头的驱动在内核中都是实现好的,关键在于应用程序的编写
V4L2 API: manual:
https://www.linuxtv.org/downloads/v4l-dvb-apis/index.html
命令列表项:
VIDIOC_QUERYCAP 获取设备支持的操作
VIDIOC_G_FMT 获取设备支持的视频格式
VIDIOC_S_FMT 设置捕获视频的格式
VIDIOC_REQBUFS 向驱动提出申请内存的请求
VIDIOC_QUERYBUF 向驱动查询申请到的内存
VIDIOC_QBUF 把帧放入队列
VIDIOC_DQBUF 从队列取出帧
VIDIOC_STREAMON 启动数据流
VIDIOC_STREAMOFF 停止数据流
VIDIOC_QUERYCTRL 查询驱动是否支持该命令
VIDIOC_G_CTRL 获取当前命令值
VIDIOC_S_CTRL 设置新的命令值
VIDIOC_G_TUNER 获取调谐器信息
VIDIOC_S_TUNER 设置调谐器信息
VIDIOC_G_FREQUENCY 获取调谐器频率
VIDIOC_S_FREQUENCY 设置调谐器频率
VIDIOC_S_STD 设置视频的制式,PAL/NTSC
VIDIOC_S_CROP 设置视频图像采集窗口的大小
VIDIOC_TRY_FMT 检查是否支持某种格式
VIDIOC_ENUM_FMT 显示所有支持的格式
VIDIOC_S_PARM 设置视频的帧率
VIDIOC_CROPCAP 缩放能力
相关结构体:
struct v4l2_capability
{
__u8 driver[16]; 驱动名字
__u8 card[32]; 设备名字
__u8 bus_info[32]; 设备在bus系统中的位置
__u32 version; 驱动版本号
__u32 capabilities; 设备支持的操作
__u32 reserved[4]; 保留字段
};
capabilities:
V4L2_CAP_VIDEO_CAPTURE 0x00000001
V4L2_CAP_VIDEO_OUTPUT 0x00000002
V4L2_CAP_VIDEO_OVERLAY 0x00000004
V4L2_CAP_VBI_CAPTURE 0x00000010
V4L2_CAP_VBI_OUTPUT 0x00000020
V4L2_CAP_SLICED_VBI_CAPTURE 0x00000040
V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080
V4L2_CAP_RDS_CAPTURE 0x00000100
#define V4L2_CAP_TUNER 0x00010000
#define V4L2_CAP_AUDIO 0x00020000
#define V4L2_CAP_RADIO 0x00040000
#define V4L2_CAP_READWRITE 0x01000000
#define V4L2_CAP_ASYNCIO 0x02000000
#define V4L2_CAP_STREAMING 0x04000000
struct v4l2_format
{
enum v4l2_buf_type type; Camera,则用户必须填写V4L2_BUF_TYPE_VIDEO_VCAPTURE
union
{
struct v4l2_pix_format pix; /* used by video capture and output devices */
struct v4l2_window win; /* V4L2_BUF_TYPE_VIDEO_OVERLAY */
struct v4l2_vbi_format vbi; /* V4L2_BUF_TYPE_VBI_CAPTURE */
struct v4l2_sliced_vbi_format; /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */
__u8 raw_data[200]; /* user_defined */
} fmt;
};
struct v4l2_fmtdesc
{
__u32 index; 应用程序设置,从零开始,依次上升
enum v4l2_buf_type type; Camera,则填写V4L2_BUF_TYPE_VIDEO_VCAPTURE
__u32 flags; 如果压缩的,则driver填写:V4L2_FMT_FLAG_COMPRESSED, 否则为0
__u8 description[32]; Image format的描述,如:YUV 4:2:2(YUYV)
__u32 pixelformat; 所支持的格式,如:V4L2_PIX_FMT_UYVY
__u32 reserved[4]; 保留
};
struct v4l2_pix_format
{
__u32 width; 视频宽度,单位像素必须是16的倍数
__u32 height; 视频高度,单位像素必须是16的倍数
__u32 pixelformat; 视频数据格式(V4L2_PIX_FMT_YUV422P|V4L2_PIX_FMT_RGB565)
enum v4l2_field field; 扫描方式,(逐行扫描,隔行扫描)
__u32 bytesperline; 一行帧图像占用字节数
__u32 sizeimage; 帧图像占用的总字节数
enum v4l2_colorspace colorspace; 颜色空间
__u32 priv; private data, depends on pixelformat
};
struct v4l2_captureparm
{
__u32 capability; 是否可以被timeperframe控制帧数.可以则:V4L2_CAP_TIMEPERFRAME
__u32 capturemodes; 是否为高清模式.如果是:则设置为:V4L2_MODE_HIGHQUALITY,高清模式会牺牲其他信息,通常设置为0
__struct v4l2_fract timeperframe; 帧数
__u32 extendedmode; 定制的,如果不支持,设置为0
__u32 readbuffers;
__u32 reserved[4];
}
struct v4l2_fract
{
__u32 numerator;分子;例:1
__u32 denominator;分母;例:30
}
struct v4l2_requestbuffers
{
__u32 count; 缓存队列中的帧图像数目
enum v4l2_buf_type type; 数据流类型,一直是V4L2_BUF_TYPE_VIDEO_CAPTURE
enum v4l2_memory memory; (V4L2_MEMORY_MMAP or V4L2_MEMORY_USERPTR
__u32 reserved[2];
};
enum v4l2_memory {
V4L2_MEMORY_MMAP = 1;
V4L2_MEMORY_USERPTR = 2;
V4L2_MEMORY_OVERLAY = 3;
};
struct v4l2_buffer
{
__u32 index; buffer 序号
enum v4l2_buf_type type: buffer 类型
__u32 byteused; buffer 已使用的字节数
__u32 flags; 区分是MMAP 还是USERPTR
enum v4l2_filed filed;
struct timeval timestamp; 获取第一个字节时的系统时间
struct v4l2_timecode timecode;
__u32 sequence; 队列中的序号
enum v4l2_memory memory; IO方式,被应用程序设置
union
{
__u32 offset; 缓存帧地址,只对MMAP有效
unsigned long useptr;
} m;
__u32 length; 缓存帧长度
__u32 input;
__u32 reserved;
}
enum v4l2_buf_type
{
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1, 视频捕获模式
V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
V4L2_BUF_TYPE_VIDEO_OVERLAY = 3,
...
...
V4L2_BUF_TYPE_PRIVATE = 0x80,
};
struct v4l2_crop
{
enum v4l2_buf_type type;
struct v4l2_rectc;
};
struct v4l2_cropcap
{
enum v4l2_buf_type type; 应用程序设置
struct v4l2_rectbounds; 最大边界
struct v4l2_rectdefrect; 默认值
struct v4l2_fract pixelaspect;
};
struct v4l2_control
{
__u32 id;
__s32 value;
}
struct v4l2_queryctrl
{
__u32 id; 命令编号
enum v4l2_ctrl_type type; 命令值得类型
__u8 name[32]; 命令名称
__s32 minimum; 最小的命令值
__s32 maximum; 最大的命令值
__s32 step; 命令值变化的步长
__s32 default_value; 默认的命令值
__u32 flags; 命令的标志
__u32 reserved[2]; 命令值的位图表示
};
enum v4l2_ctrl_type {
V4L2_CTRL_TYPE_INTEGER = 1, /* 整形 */
V4L2_CTRL_TYPE_BOOLEAN = 2, /* 真值 */
V4L2_CTRL_TYPE_MENU = 3, /* 菜单 */
V4L2_CTRL_TYPE_BUTTON = 4, /* 无值 */
V4L2_CTRL_TYPE_INTEGER64 = 5, /* 后面三种不常用 */
V4L2_CTRL_TYPE_CTRL_CLASS = 6,
V4L2_CTRL_TYPE_STRING = 7,
};
命令的标志取值如下:
/* Control flags */
#define V4L2_CTRL_FLAG_DISABLED 0x0001
#define V4L2_CTRL_FLAG_GRABBED 0x0002
#define V4L2_CTRL_FLAG_READ_ONLY 0x0004
#define V4L2_CTRL_FLAG_UPDATE 0x0008
#define V4L2_CTRL_FLAG_INACTIVE 0x0010
#define V4L2_CTRL_FLAG_SLIDER 0x0020
#define V4L2_CTRL_FLAG_WRITE_ONLY 0x0040
/* Query flag, to be ORed with the control ID */
#define V4L2_CTRL_FLAG_NEXT_CTRL 0x80000000
V4L2_CID_CONTRAST (V4L2_CID_BASE+1) /* 对比度调节 */
V4L2_CID_SATURATION (V4L2_CID_BASE+2) /* 饱和度调节 */
V4L2_CID_AUDIO_VOLUME (V4L2_CID_BASE+5) /* 音量调节 */
V4L2_CID_AUDIO_MUTE (V4L2_CID_BASE+9) /* 静音设置 */
V4L2_CID_DO_WHITE_BALANCE (V4L2_CID_BASE+13) /* 白平衡调节 */
V4L2_CID_GAMMA (V4L2_CID_BASE+16) /* 伽马值调节 */
V4L2_CID_EXPOSURE (V4L2_CID_BASE+17) /* 曝光度调节 */
V4L2_CID_PRIVATE_ATXX_FLASH (V4L2_CID_PRIVATE_BASE + 2) /* 闪光灯控制 */
V4L2_CID_PRIVATE_ATXX_FRAME (V4L2_CID_PRIVATE_BASE + 12) /* 帧率调节 */
}
struct v4l2_tuner {
__u32 index; /* 调谐器编号,由应用程序设置 */
__u8 name[32]; /* 调谐器名称 */
enum v4l2_tuner_type type; /* 调谐器类型 */
__u32 capability; /* 调谐器支持的操作 */
__u32 rangelow; /* 最低频率值,单位为62.5Hz或者62.5KHz */
__u32 rangehigh; /* 最高频率值 */
__u32 rxsubchans; /* 接收的音频信号类型 */
__u32 audmode; /* 当前音频播放形式 */
__s32