QT获取HDMI视频采集数据
USB HDMI SDK Windows和Linux RTSP RTMP 二次开发 视频采集
·
因为项目需要,从某宝采购了一个pipivision HDMI采集卡,该采集卡为USB3.0接口,支持HDMI输入和环出,还有混音功能,以下分享源码下载地址,我们根据源码学习使用方法。
查看QT示例源码,在文件DevManager.h中包装了设备的很多操作,使用起来非常方便,我们只需要把源文件DevManager.cpp添加到工程并包含该头文件即可,内部的层次结构如下图所示。
经过查看,视频数据采集有三种方式可以选择,分别为数据回调,拷贝和锁定,每种方式都有各自的使用场景。
数据回调方式比较直接,采集到的每帧数据都会调用对应的回调函数处理,因此不能存在耗时的处理,否则会影响数据采集;
数据拷贝的方式可以把数据拷贝到对应的缓冲,而且支持裁剪、缩放、旋转和Color Space转换(例如YUV转RGB格式);
数据锁定方式可以随时捕获数据,不需要设置回调函数,数据使用完毕需要解锁才能继续采集,因此不能存在耗时的处理;
要操作对应的设备,我们先在自定义的类里面声明一个对象:
CDevSDK dev;
然后在自定义类的构造函数初始化列表中初始化传入索引号打开第0个采集卡:
dev(0)
如果设备打开成功我们就启动该设备
if (dev) dev.DeviceStart();
接下来我们根据需要使用其中的一种方式来捕获数据即可,执行的方式也有区别;
1、数据回调方式,需要注意是在另一个线程中执行的;
2、数据拷贝的方式,同步执行;
3、数据锁定的方式,同步执行。
主要代码如下:
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
, dev(0) // open device 0
{
ui->setupUi(this);
if (dev)
{
dev.DeviceStart();
}
}
void CALLBACK frameCallback(uvsobj_handle obj, const uvs_frame_info_t *frame, void *userData)
{
}
// 回调方式(任选一种即可)
void Dialog::on_callback_clicked()
{
if (dev)
{
dev.SetVideoRawFrameCallback(frameCallback);
}
}
// 拷贝方式(任选一种即可)
void Dialog::on_copy_clicked()
{
if (dev)
{
uvs_frame_info_t frame;
memset(&frame, 0, sizeof(frame)); // 数据默认存放在内部缓冲,也可以指定缓冲地址
dev.CopyVideoFrame(frame);
}
}
// 锁定方式(任选一种即可)
void Dialog::on_lock_clicked()
{
if (dev)
{
uvs_frame_info_t frame;
if (dev.LockVideoRawFrame(frame) == UVS_OK)
{ // 处理frame中的数据,然后释放
dev.UnlockVideoRawFrame();
}
}
}
Dialog::~Dialog()
{
dev.DeviceClose();
delete ui;
}
更多推荐
已为社区贡献1条内容
所有评论(0)