Qt音视频开发2-vlc回调处理
2023-09-11 14:18:39 时间
一、前言
用句柄来显示视频,方便是很方便,但是有个缺点就是不能拿到实时视频的每张图片的数据,这个就比较讨厌,大部分的监控行业的应用,除了截图以外,很可能需要拿到图片自己做一些处理的,而且拿到图片自己绘制的话,这个灵活性就大大增强了,比如绘制各种OSD标签,想怎么绘制就怎么绘制,想在那里绘制就在那里绘制,句柄的话还得搞个标签没有父类自动跟随移动非常讨厌,一个通道就好几个标签,32个通道那就快上百个标签了,效率蛮低的,处理方式看起来傻傻的,每次移动这每个通道都要给标签自动计算位置并move过去。
于是回调就很有必要的,一个好处是可以拿到图片本身的数据用来额外的处理比如人工智能分析人脸分析等,还有一个好处是OSD标签等东西可以自己自由绘制,在vlc中回调的数据格式可以自行指定,比如RV32对应Qt中的Format_RGB32,RGBA对应Qt中的Format_RGBA8888,YUYV则可以直接用QOpenGlWidget来显示,通过GPU来显示还是很好地,大大降低CPU的占用。
二、功能特点
- 多线程实时播放视频流和本地视频。
- 支持windows+linux+mac,支持vlc2和vlc3。
- 多线程显示图像,不卡主界面。
- 自动重连网络摄像头。
- 可设置边框大小即偏移量和边框颜色。
- 可设置是否绘制OSD标签即标签文本或图片和标签位置。
- 可设置两种OSD位置和风格。
- 可设置是否保存到文件以及文件名。
- 可直接拖曳文件到vlcwidget控件播放。
- 支持h265视频流+rtmp等常见视频流。
- 可暂停播放和继续播放。
- 支持回调模式和句柄两种模式。
- 支持线程读取进度等信息和事件回调两种处理模式。
- 自动将当前播放位置和音量大小是否静音以信号发出去。
- 提供接口设置播放位置和音量及设置静音。
- 支持存储单个视频文件和定时存储视频文件。
- 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
三、效果图
四、相关站点
- 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
- 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
- 个人主页:https://blog.csdn.net/feiyangqingyun
- 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
- 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652
五、核心代码
if (callback) {
callbackData = new CallbackData;
callbackData->thread = this;
callbackData->pixels = new uchar[bufferWidth * bufferHeight * 4];
memset(callbackData->pixels, 0, bufferWidth * bufferHeight * 4);
int width = callbackData->thread->getBufferWidth();
int height = callbackData->thread->getBufferHeight();
//设置回调拿到每帧数据
libvlc_video_set_callbacks(vlcPlayer, lock, unlock, display, callbackData);
//设置每帧格式 RV32-Format_RGB32 RGBA-Format_RGBA8888 YUYV I420
libvlc_video_set_format(vlcPlayer, "RV32", width, height, width * 4);
}
//#######拿到一帧数据回调
typedef struct CallbackData {
QMutex mutex;
VlcThread *thread;
uchar *pixels;
} CallbackData;
static void *lock(void *op, void **plane)
{
CallbackData *callbackData = (CallbackData *)op;
callbackData->mutex.lock();
*plane = callbackData->pixels;
return NULL;
}
static void unlock(void *op, void *pic, void *const *plane)
{
CallbackData *callbackData = (CallbackData *)op;
uchar *data = (uchar *)*plane;
int width = callbackData->thread->getBufferWidth();
int height = callbackData->thread->getBufferHeight();
QImage image(data, width, height, QImage::Format_RGB32);
callbackData->thread->setImage(image);
callbackData->mutex.unlock();
}
static void display(void *op, void *pic)
{
(void)op;
}
//####################
相关文章
- QT-Qt设置背景图片
- Qt-char*与QString互转 floatToqstring char*与QString互转 qt字符串与字符串数组操作 Qt 的QString类的使用
- s3c2410上搭建QT/Embedded4.8.5开发环境(二)--安装arm平台qt库qt-everywhere-opensource-src-4.8.5
- Qt音视频开发36-超时检测和自动重连的设计
- Qt音视频开发34-Onvif时间设置
- Qt音视频开发32-Onvif网络设置
- Qt音视频开发11-ffmpeg常用命令
- Qt编写自定义控件22-蚂蚁线
- Qt编写地图综合应用57-跨平台(win、linux、mac、uos、kylin等)
- Qt安卓开发经验011-020
- Qt开发经验小技巧191-195
- Qt开发经验小技巧171-175
- Qt开发经验小技巧141-145
- Qt通用方法及类库3
- Qt开发经验小技巧71-80
- Qt如何实现邮件转发
- Qt OpenGL 3D模型
- Qt Quick 多媒体开发播放音乐和视频
- 【Qt教程】使用 QJson 处理 JSON
- Qt 音乐播放器
- Qt开发-QT Widgets
- Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例
- 基于Qt的Littlevgl移植(Windos10)
- Qt开发经验小技巧
- 嵌入式linux开发,Qt中,为不用的Kit设定不同的条件编译,以区分不同平台引用的三方库和不同的代码调用
- Qt开发,报错:This application failed to start because no Qt platform plugin could be initialized.
- qt 怎么创建子对话
- Qt编写可视化大屏电子看板系统16-标准柱状图