Linux一个摄像头2个video,V4L2视频开发(摄像头)

本文介绍了如何使用Linux的V4L2接口和x264库,实现一个uvc摄像头的视频捕获、h264编码,并通过创建线程来处理视频帧,实现一个摄像头同时产生两个视频流。代码中包含V4L2_Video类,用于视频读取、格式转换、编码和帧处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

V4L2(Video for Linux2), 是专门为 linux 设备设计的一套视频框架。

以下代码包括uvc摄像头的V4L2视频捕获与h264软编码(使用x264库)

v4l2_video.h

#ifndef V4L2_VIDEO_H

#define V4L2_VIDEO_H

#include

#include

#include

#include "x264.h"

class V4L2_Video : public QObject

{

Q_OBJECT

public:

explicit V4L2_Video(QObject *parent = nullptr);

int init();

void start();

void stop();

int release();

int video_read(char **buffer, int *buffer_size);

int get_width();

int get_height();

int get_fps();

private:

typedef struct VideoBuffer

{

uint8_t *start;

unsigned int length;

enum nal_unit_type_e type;

}VideoBuffer;

int fd;

VideoBuffer *video_buffer;

bool m_is_start;

std::queue m_encode_queue; // 等待编码的帧队列

std::queue m_send_queue; // 等待发送的帧队列

pthread_mutex_t m_encode_queue_lock;

pthread_mutex_t m_send_queue_lock;

int frameHandle(VideoBuffer v_buffer);

void yuyv422ToYuv420p(int inWidth, int inHeight, uint8_t *pSrc, uint8_t *pDest);

static void *frame_process_thread(void *ptr);

static void *yuyv422_to_H264_thread(void *ptr);

signals:

public slots:

};

#endif // V4L2_VIDEO_H

v4l2_video.cpp

#include "v4l2_video.h"

#include

#include

#include

#include

#include

#include "mainwidget.h"

#define VIDEO_FILE "/dev/video8"

#define IMAGEWIDTH 640

#define IMAGEHEIGHT 480

#define VIDEO_FPS 25

#define ENCODE_QUEUE_FRAME_NUM 4

#define SEND_QUEUE_FRAME_NUM ENCODE_QUEUE_FRAME_NUM * 8

V4L2_Video::V4L2_Video(QObject *parent) : QObject(parent)

{

m_is_start = false;

pthread_mutex_init(&m_encode_queue_lock, nullptr);

pthread_mutex_init(&m_send_queue_lock, nullptr);

}

int V4L2_Video::init()

{

struct v4l2_capability cap;

struct v4l2_format fmt;

struct v4l2_streamparm stream_parm;

struct v4l2_requestbuffers req;

struct v4l2_buffer buf;

unsigned int buffer_n;

pthread_t thread_id;

int ret;

fd = open(VIDEO_FILE, O_RDWR);

if(fd == -1)

{

printf("Error opening V4L2 interface\n");

return -1;

}

// 查询设备属性

ioctl(fd, VIDIOC_QUERYCAP, &cap);

printf("Driver Name:%s\nCard Name:%s\nBus info:%s\nDriver Version:%u.%u.%u\n",cap.driver,cap.card,cap.bus_info,(cap.version>>16)&0XFF, (cap.version>>8)&0XFF,cap.version&0XFF);

//显示所有支持帧格式

struct v4l2_fmtdesc fmtdesc;

fmtdesc.index=0;

fmtdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;

printf("Support format:\n");

while(ioctl(fd,VIDIOC_ENUM_FMT,&fmtdesc)!=-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值