中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt mpv解碼播放怎么實現

發布時間:2021-12-15 10:31:28 來源:億速云 閱讀:290 作者:iii 欄目:互聯網科技

這篇文章主要介紹“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上不知道如何傳入參數,如果有誰有辦法可以留言,謝謝。

解碼播放流程:

  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. 支持h365視頻流+rtmp等常見視頻流。

  8. 可暫停播放和繼續播放。

  9. 支持存儲單個視頻文件和定時存儲視頻文件。

  10. 自定義頂部懸浮條,發送單擊信號通知,可設置是否啟用。

  11. 可設置畫面拉伸填充或者等比例填充。

  12. 可對視頻進行截圖(原始圖片)和截屏。

  13. 錄像文件存儲MP4文件。

  14. 支持qsv、dxva2、d3d11va等硬解碼。

三、效果圖

Qt mpv解碼播放怎么實現

四、核心代碼

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解碼播放怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

綦江县| 九台市| 永春县| 宣威市| 南岸区| 涟水县| 西乌珠穆沁旗| 丽江市| 长治县| 龙川县| 康保县| 兴仁县| 梁山县| 梅州市| 阿克| 阿拉善右旗| 吉木乃县| 禹城市| 女性| 永登县| 连城县| 贵阳市| 乡宁县| 伊金霍洛旗| 高州市| 塔河县| 中阳县| 图木舒克市| 乌鲁木齐市| 瓮安县| 余干县| 凉城县| 施甸县| 诏安县| 二手房| 邵阳市| 辽阳县| 正安县| 卓资县| 莒南县| 凭祥市|