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. 把采集的麦/声卡 ...
随机推荐
- tekton初次安装报错“containers with incomplete status: [place-tools]”
报错内容 在按照官方部署方式部署完毕以后,执行第一个taskrun的时候就报错了,报错如下 Status: Conditions: Last Transition Time: 2022-08-08T0 ...
- Python 实现Excel XLS和XLSX格式相互转换
在日常工作中,我们经常需要处理和转换不同格式的Excel文件,以适应不同的需求和软件兼容性.Excel文件的两种常见格式是XLS(Excel 97-2003)和XLSX(Excel 2007及以上版本 ...
- Kubernetes 集群中 Ingress 故障的根因诊断
作者:scwang18,主要负责技术架构,在容器云方向颇有研究. 前言 KubeSphere 是青云开源的基于 Kubernetes 的云原生分布式操作系统,提供了比较炫酷的 Kubernetes 集 ...
- docker常用命令与应用
docker入门与docker file介绍 原文地址 docker常用命令 https://blog.csdn.net/leilei1366615/article/details/106267225 ...
- 华为IPv6 GRE隧道
IPv6 over IPv4 GRE封装隧道 实验目标: 该实验参考了华为官网案例配置 https://support.huawei.com/enterprise/zh/doc/EDOC1000097 ...
- SQL 清除数据库中所有表的数据
进行数据库的操作,有时候我们需要清除数据库中所有的数据,如果你不嫌麻烦,可以一次一次的执行truncate操作,但是如果遇到有无数个表的情况,这种操作无疑是很耗时的 我曾经百度别人的代码,看都没看就直 ...
- Ubuntu 22.04 LTS 离线安装 Harbor v2.11 (附https认证,Trivy镜像扫描)
Harbor 介绍 Harbor是一个开源的企业级Docker Registry服务,它提供了一个安全.可信赖的仓库来存储和管理Docker镜像.Harbor翻译为中文名称为"庇护:居住;& ...
- 2024-11-16:哈沙德数。用go语言,如果一个整数能够被它的各个数位上数字的和整除, 我们称这个整数为哈沙德数(Harshad number)。 给定一个整数 x, 如果 x 是哈沙德数,则返回
2024-11-16:哈沙德数.用go语言,如果一个整数能够被它的各个数位上数字的和整除, 我们称这个整数为哈沙德数(Harshad number). 给定一个整数 x, 如果 x 是哈沙德数,则返回 ...
- [昌哥IT课堂]使用MySQL Shell 部署沙盒数据库实例详解
概述:这部分解释了如何使用AdminAPI设置沙盒部署.部署和使用本地MySQL的沙盒实例是开始探索AdminAPI的好方法.在将功能部署到生产服务器之前,您可以在本地测试功能.AdminAPI具有内 ...
- 淘宝长仁:JVM性能指标的理论极限和衡量方法(TaobaoJVM)
在2013年阿里巴巴集团主办的ADC•阿里技术嘉年华,这是一场专属于<互联网工程师>的"技术盛宴",倡导<干货分享>的大会上,51CTO记者有幸采访到了阿里 ...