一、项目思路
实时监控系统/直播系统,通过V4L2接口从摄像头采集YUYV格式的视频;用H264对视频数据进行编码;然后通过RTMP协议发送至支持了rtmp的nginx流媒体服务器;用客户端使用VLC从服务器拉流显示。
V4L2----->H264----->RTMP------>nginx------>VLC
V4L2:linux下摄像头操作的框架(主要用来采集图像视频)
YUYV:图像格式
H264:音视频编码格式(图像的压缩算法)
RTMP:用来传输视频、音频流数据
nginx:反向代理服务器
VLC:一款开源的跨平台多媒体播放器和服务器
二、配置环境
参考:
Ubuntu16.04使用笔记本电脑摄像头操作方式_ubuntu16.04找不到摄像头图标-优快云博客
三、相关技术
3.1、V4L2
V4L2(Video for Linux 2)是用于Linux操作系统的视频捕获框架,允许开发者访问和控制视频设备,如摄像头、摄像机和其他视频输入设备。
应用程序通过V4L2框架,对摄像头进行操作,如 设置摄像头的频率、图像参数、查看摄像头支持的配置等等;在使用V4L2框架采集摄像头时,主要步骤 1、打开设备;2、对设备进行配置;3、设置数据采集方式;4、处理数据;5、关闭设备。
摄像头属性相关结构体:
struct v4l2_format {
__u32 type; // 数据流类型(例如:V4L2_BUF_TYPE_VIDEO_CAPTURE)
union {
struct v4l2_pix_format pix; // 像素格式
// 更多格式类型可以通过 union 扩展
} fmt;
};
struct v4l2_pix_format {
__u32 width; // 图像宽度
__u32 height; // 图像高度
__u32 pixelformat; // 像素格式(例如:V4L2_PIX_FMT_YUV420)
// 更多参数可以根据不同的像素格式类型进行扩展
};
struct v4l2_capability {
char driver[16]; // 驱动程序名称
char card[32]; // 设备名称或描述
char bus_info[32]; // 连接总线信息
__u32 version; // V4L2 规范的版本号
__u32 capabilities; // 设备支持的能力标志
};
/*ioctl 查看支持的驱动*/
ret = ioctl(fd, VIDIOC_QUERYCAP, &capability);
if (ret == -1) {
perror("camera->init");
close(fd);
return -1;
}
3.2、YUV
YUV 是一种将彩色图像分离为亮度(Y)和色度(UV)信息的图像编码格式。常用有YUV422格式和YUV420格式。与RGB相比YUV422的大小是其2/3,而YUV420是其1/2。在YUV422格式中,按照U、V分量在时空上的排列顺序不同,可以将他们分为YUYV、YVYU、UYVY、VYUY四种不同的排列方式;在YUV420格式中,又分为I420(YU12)、YV12、NV12、NV21。
四、源代码
1.cam.h
#ifndef __CAM_H__
#define __CAM_H__
#define CAMERA_USB "/dev/video0"//填写自己video0文件路径
int camera_init(char *devpath, unsigned int *wi