Qt音视频开发2-vlc回调处理
时间:2022-07-22
本文章向大家介绍Qt音视频开发2-vlc回调处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、前言
用句柄来显示视频,方便是很方便,但是有个缺点就是不能拿到实时视频的每张图片的数据,这个就比较讨厌,大部分的监控行业的应用,除了截图以外,很可能需要拿到图片自己做一些处理的,而且拿到图片自己绘制的话,这个灵活性就大大增强了,比如绘制各种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;
}
//####################
- 独家 | 教你实现数据集多维可视化(附代码)
- NoSQL | Redis、Memcache、MongoDB特点、区别以及应用场景
- cf--------(div1)1A. Theatre Square
- 离线网页制作器(beta1.0)
- uva---(11549)CALCULATOR CONUNDRUM
- CF---(452)A. Eevee
- MySQL排序内部原理探秘
- Uva----------(11078)Open Credit System
- 学习HTML5之塔克大战(详细记录)
- 学习HTML5之新特性标签一览(详细)
- poj----(1251)Jungle Roads(最小生成树)
- poj-------(2240)Arbitrage(最短路)
- MySQL在线DDL修改表结构的简单经验分享
- HDUOJ-----(1162)Eddy's picture(最小生成树)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义View实现饼状图带动画效果
- Android音视频之视频采集(系统API预览)
- 在Node.js中使用Multer进行文件上传
- Android实现自动填充短信验证码功能
- django项目中新增app的2种实现方法
- 如何使用Node.js编辑XML文件
- Windows下安装yarn的三种方法
- python topk()函数求最大和最小值实例
- 详解Ubuntu环境下部署Django+uwsgi+nginx总结
- 如何从Node.js中的命令行读取输入
- pyqt5中动画的使用详解
- PyQt使用QPropertyAnimation开发简单动画
- 如何使用JavaScript漂亮地打印JSON对象
- Android使用AsyncTask加载图片的操作流程
- nodejs中post请求方式,req.body接值为空如何解决