• 2438阅读
  • 1回复

Qt音视频开发12-mpv解码播放 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2020-08-18

## 一、前言
之前玩了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上不知道如何传入参数,如果有谁有办法可以留言,谢谢。

解码播放流程:

1. 调用mpv_create创建实例。
2. 调用mpv_set_option设置播放句柄。
3. 调用mpv_set_property设置一些属性比如启用键盘输入等。
4. 调用mpv_set_option设置一些参数比如硬解码、超时时间等。
5. 调用mpv_initialize初始化实例。
6. 调用mpv_command_async执行命令loadfile打开文件播放。
7. 调用mpv_terminate_destroy释放实例。

## 二、功能特点
1. 多线程实时播放视频流+本地视频等。
2. 支持windows+linux+mac。
3. 多线程显示图像,不卡主界面。
4. 自动重连网络摄像头。
5. 可设置是否保存到文件以及文件名。
6. 可直接拖曳文件到mpvwidget控件播放。
7. 支持h265视频流+rtmp等常见视频流。
8. 可暂停播放和继续播放。
9. 支持存储单个视频文件和定时存储视频文件。
10. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
11. 可设置画面拉伸填充或者等比例填充。
12. 可对视频进行截图(原始图片)和截屏。
13. 录像文件存储MP4文件。
14. 支持qsv、dxva2、d3d11va等硬解码。

## 三、效果图



## 四、相关站点
1. 国内站点:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)
2. 国际站点:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)
3. 个人主页:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)
4. 知乎主页:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)
5. 体验地址:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)

## 五、核心代码
```c++
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实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
在线liulin188

只看该作者 1楼 发表于: 2020-08-18
楼主牛逼,我就是用的这个,找到志同道合的人了
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
快速回复
限100 字节
 
上一个 下一个