实时监控系统/直播系统(一)- V4L2打开摄像头

一、项目思路

实时监控系统/直播系统,通过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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值