Qt音视频开发12-mpv解码播放
一、前言
之前玩了vlc解码和ffmpeg解码,前阵子有个客户需要换成mpv解码,于是研究了下mpv的使用方法,自从用了mpv以后发现爱不释手,这玩意天生适合极客和程序员啊,居然将各种处理封装成了命令和属性调用,比如播放进度,你只需要读取属性time-pos即可,如果要读取音量只需要读取属性volume即可,设置音量就直接设置属性volume对应的值即可,我的乖乖,这太棒了棒极了,这不就是咱们梦寐以求的处理方式吗?你只需要封装几个通用的处理接口(读取属性mpv_get_property、设置属性mpv_set_property、执行命令mpv_command_node、设置参数mpv_set_option),就涵盖了绝大多数的功能,你说简单易用不,要的就是这种效果呢!!!
mpv是一款基于MPlayer和MPlayer2的多平台开源播放器,是一个开源的,跨平台视频播放器,带有极简的 GUI 界面以及丰富的命令行控制。其在Linux上拥有广泛的输出设备支持,内置ffmpeg解码器,支持绝大部分的视频和音频格式,支持本地播放和网络播放,支持ass特效字幕,GPU解码能力十分出色。MPV有标准播放器该有的所有功能,你可以播放各种视频,以及通过常用快捷键来控制播放。在网络上经常被誉为神级播放器,神一般的存在!
通过mpv来显示视频,目前只找到句柄的形式,回调的形式没有找到,不知道是不是不支持,翻遍了官网的手册和说明,硬是没有找到,还有一个问题就是通过mpv_set_option设置播放的句柄,在linux上不知道如何传入参数,如果有谁有办法可以留言,谢谢。
解码播放流程:
- 调用mpv_create创建实例。
- 调用mpv_set_option设置播放句柄。
- 调用mpv_set_property设置一些属性比如启用键盘输入等。
- 调用mpv_set_option设置一些参数比如硬解码、超时时间等。
- 调用mpv_initialize初始化实例。
- 调用mpv_command_async执行命令loadfile打开文件播放。
- 调用mpv_terminate_destroy释放实例。
二、功能特点
- 多线程实时播放视频流+本地视频等。
- 支持windows+linux+mac。
- 多线程显示图像,不卡主界面。
- 自动重连网络摄像头。
- 可设置是否保存到文件以及文件名。
- 可直接拖曳文件到mpvwidget控件播放。
- 支持h265视频流+rtmp等常见视频流。
- 可暂停播放和继续播放。
- 支持存储单个视频文件和定时存储视频文件。
- 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
- 可设置画面拉伸填充或者等比例填充。
- 可对视频进行截图(原始图片)和截屏。
- 录像文件存储MP4文件。
- 支持qsv、dxva2、d3d11va等硬解码。
三、效果图

四、相关站点
- 国内站点: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
五、核心代码
bool MpvThread::init()
{
//判断该摄像机是否能联通
if (checkConn && isRtsp) {
if (!checkUrl(url, checkTime)) {
return false;
}
}
//创建实例
mpvPlayer = mpv_create();
//回调方式和句柄方式两种分别处理
if (callback) {
return false;
} else {
//设置播放句柄
if (playWidget == NULL) {
return false;
}
//下面是WIN上的方法,如何在linux上的方法还没找到
HWND wid = (HWND)playWidget->winId();
mpv_set_option(mpvPlayer, "wid", MPV_FORMAT_INT64, &wid);
}
//请求级别日志消息
mpv_request_log_messages(mpvPlayer, "info");
//启用默认绑定
setValue("input-default-bindings", "yes");
//启用键盘输入
setValue("input-vo-keyboard", "yes");
//设置硬件加速 none auto any d3d11va dxva2
setOption("hwdec", hardware);
//设置通信协议 tcp udp
setOption("rtsp-transport", transport);
//设置网络超时时间 单位秒
setOption("network-timeout", 3);
//初始化实例
if (mpv_initialize(mpvPlayer) < 0) {
return false;
}
//设置保存文件,目前发现有部分视频流不行,原因未知
this->initSave();
//创建事件管理器
if (callbackevent) {
attachEvents(mpvPlayer);
mpv_set_wakeup_callback(mpvPlayer, wakeup, this);
}
QByteArray data = url.toUtf8();
//command(QVariantList() << "loadfile" << data.data());
const char *args[] = {"loadfile", data.data(), NULL};
if (mpv_command_async(mpvPlayer, 0, args) < 0) {
return false;
}
//打印支持的属性列表和命令列表
//qDebug() << TIMEMS << getValue("property-list") << getValue("command-list");
//打印组件的版本
//qDebug() << TIMEMS << getValue("mpv-version") << getValue("ffmpeg-version");
//qDebug() << TIMEMS << "init mpv finsh";
return true;
}
void MpvThread::free()
{
if (mpvPlayer != NULL) {
mpv_terminate_destroy(mpvPlayer);
mpvPlayer = NULL;
}
//qDebug() << TIMEMS << "close mpv ok";
}
Qt音视频开发12-mpv解码播放的更多相关文章
- Android 音视频深入 三 MP4解码播放视频 (附源码下载)
本篇项目地址,名字是媒体解码MediaCodec,MediaExtractor,求starhttps://github.com/979451341/Audio-and-video-learning-m ...
- Android 音视频开发(一):PCM 格式音频的播放与采集
什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...
- Android WebRTC 音视频开发总结
www.cnblogs.com/lingyunhu/p/3621057.html 前面介绍了WebRTCDemo的基本结构,本节主要介绍WebRTC音视频服务端的处理,,转载请说明出处(博客园RTC. ...
- WebRTC 音视频开发
WebRTC 音视频开发 webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...
- 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)
随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...
- Android开发 音视频开发需要了解的专业术语知识
前言 在摸索一段时间的音视频开发后,越来越发现这个坑的深度真是特别的深. 除了了解Android自带的音视频处理API以外,还得了解一些视频与音频方面的知识.这篇博客就是主要讲解这方面的专业术语.内容 ...
- Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- Android IOS WebRTC 音视频开发总结(十九)-- kurento
折腾了一个多星期终于将kurento的环境搭建好(开发阶段的产品,有些BUG要自己解决),所以单独写篇文件来介绍. 下面开始介绍kurento,文章来自博客园RTC.Blacker,转载请说明出处. ...
- Android 音视频开发学习思路
Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...
- 音视频开发-FFmpeg
音视频开发是个非常复杂的,庞大的开发话题,初涉其中,先看一下结合 OEIP(开源项目) 新增例子. 可以打开flv,mp4类型文件,以及rtmp协议音视频数据,声音的播放使用SDL. 把采集的麦/声卡 ...
随机推荐
- P1762 偶数&杨辉三角
P1762 偶数&杨辉三角(天立OI) 解题思路 一.结论法 杨辉三角形结论 第\(n\)行有\(n\)个数. 每行奇数个数必为\(2^k\)(\(k\)不是行数) 当行数恰为\(2^k\)时 ...
- Machine Learning Week_9 Anomaly Detection and Recommend System
1. Anomaly Detection I'd like to tell you about a problem called Anomaly Detection. This is a reason ...
- SpringMvc请求注解@ResponseBody
1.概念 注解 @ResponseBody,使用在控制层(controller)的方法上. 2.作用 作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端. ...
- docker存储配置与管理--项目三
一.Docker存储概念 1.容器本地存储与Docke存储驱动 容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储.采用的是联合文件系统.通过存 储驱动进行管理. 容器本地存储空间:分层结构 ...
- ABC343:起航
ABC343:起航 2024/3/2/22:53 有点儿晚了,简单总结一下. 前4题都很基础,一点点小思维,其中C题 边界又盲目追求刚刚好,WA了一次,总结经验,程序实际设计应该略微大于数据范围. E ...
- C++递归创建文件夹
根据传入的参数递归进行目录的创建. 函数描述: 递归创建目录. 入参: 所要创建的目录. 返回值: 创建成功,返回TRUE:否则返回FALSE. 1 BOOL CreateDirTree(LPCTST ...
- 别再被多线程搞晕了!一篇文章轻松搞懂 Linux 多线程同步!
前言 大家有没有遇到过,代码跑着跑着,线程突然抢资源抢疯了?其实,这都是"多线程同步"在作怪.多线程同步是个老生常谈的话题,可每次真正要处理时还是让人头疼.这篇文章,带你从头到尾掌 ...
- ubuntu服务器上部署EMQX SLL
1. 安装MQTT的简易服务器集成环境EMQX $wget https://www.emqx.com/zh/downloads/broker/5.1.6/emqx-5.1.6-ubuntu18 ...
- 【Azure App Service】在App Service for Windows上验证能占用的内存最大值
问题描述 在创建App Service服务的时候,根据定价层不同,内存使用的最大值也有不同.但在实际测试中,发现内存最大只能占用2GB左右, 而定价层中内存分配明明是大于2GB(比如B3定价层的内存为 ...
- 关于meta-analysis的一些评论
当提到meta-analysis,很多人的反应是,水文章的神器. 一方面是因为Meta分析作为系统综述里一个定量分析方法,能把各种研究结果有组织有纪律地综合起来,证据档次瞬间飙升,能甩传统综述好几条街 ...