这篇文章主要介绍“Qt mpv解码播放怎么实现”,在日常操作中,相信很多人在Qt mpv解码播放怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Qt 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控件播放。
支持h365视频流+rtmp等常见视频流。
可暂停播放和继续播放。
支持存储单个视频文件和定时存储视频文件。
自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
可设置画面拉伸填充或者等比例填充。
可对视频进行截图(原始图片)和截屏。
录像文件存储MP4文件。
支持qsv、dxva2、d3d11va等硬解码。
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 mpv解码播放怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。