您好,登錄后才能下訂單哦!
這篇文章主要介紹“Qt mpv解碼播放怎么實現(xiàn)”,在日常操作中,相信很多人在Qt mpv解碼播放怎么實現(xiàn)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Qt mpv解碼播放怎么實現(xiàn)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
之前玩了vlc解碼和ffmpeg解碼,前陣子有個客戶需要換成mpv解碼,于是研究了下mpv的使用方法,自從用了mpv以后發(fā)現(xiàn)愛不釋手,這玩意天生適合極客和程序員啊,居然將各種處理封裝成了命令和屬性調(diào)用,比如播放進(jìn)度,你只需要讀取屬性time-pos即可,如果要讀取音量只需要讀取屬性volume即可,設(shè)置音量就直接設(shè)置屬性volume對應(yīng)的值即可,我的乖乖,這太棒了棒極了,這不就是咱們夢寐以求的處理方式嗎?你只需要封裝幾個通用的處理接口(讀取屬性mpv_get_property、設(shè)置屬性mpv_set_property、執(zhí)行命令mpv_command_node、設(shè)置參數(shù)mpv_set_option),就涵蓋了絕大多數(shù)的功能,你說簡單易用不,要的就是這種效果呢?。?!
mpv是一款基于MPlayer和MPlayer2的多平臺開源播放器,是一個開源的,跨平臺視頻播放器,帶有極簡的 GUI 界面以及豐富的命令行控制。其在Linux上擁有廣泛的輸出設(shè)備支持,內(nèi)置ffmpeg解碼器,支持絕大部分的視頻和音頻格式,支持本地播放和網(wǎng)絡(luò)播放,支持ass特效字幕,GPU解碼能力十分出色。MPV有標(biāo)準(zhǔn)播放器該有的所有功能,你可以播放各種視頻,以及通過常用快捷鍵來控制播放。在網(wǎng)絡(luò)上經(jīng)常被譽(yù)為神級播放器,神一般的存在!
通過mpv來顯示視頻,目前只找到句柄的形式,回調(diào)的形式?jīng)]有找到,不知道是不是不支持,翻遍了官網(wǎng)的手冊和說明,硬是沒有找到,還有一個問題就是通過mpv_set_option設(shè)置播放的句柄,在linux上不知道如何傳入?yún)?shù),如果有誰有辦法可以留言,謝謝。
解碼播放流程:
調(diào)用mpv_create創(chuàng)建實例。
調(diào)用mpv_set_option設(shè)置播放句柄。
調(diào)用mpv_set_property設(shè)置一些屬性比如啟用鍵盤輸入等。
調(diào)用mpv_set_option設(shè)置一些參數(shù)比如硬解碼、超時時間等。
調(diào)用mpv_initialize初始化實例。
調(diào)用mpv_command_async執(zhí)行命令loadfile打開文件播放。
調(diào)用mpv_terminate_destroy釋放實例。
多線程實時播放視頻流+本地視頻等。
支持windows+linux+mac。
多線程顯示圖像,不卡主界面。
自動重連網(wǎng)絡(luò)攝像頭。
可設(shè)置是否保存到文件以及文件名。
可直接拖曳文件到mpvwidget控件播放。
支持h365視頻流+rtmp等常見視頻流。
可暫停播放和繼續(xù)播放。
支持存儲單個視頻文件和定時存儲視頻文件。
自定義頂部懸浮條,發(fā)送單擊信號通知,可設(shè)置是否啟用。
可設(shè)置畫面拉伸填充或者等比例填充。
可對視頻進(jìn)行截圖(原始圖片)和截屏。
錄像文件存儲MP4文件。
支持qsv、dxva2、d3d11va等硬解碼。
bool MpvThread::init() { //判斷該攝像機(jī)是否能聯(lián)通 if (checkConn && isRtsp) { if (!checkUrl(url, checkTime)) { return false; } } //創(chuàng)建實例 mpvPlayer = mpv_create(); //回調(diào)方式和句柄方式兩種分別處理 if (callback) { return false; } else { //設(shè)置播放句柄 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"); //啟用默認(rèn)綁定 setValue("input-default-bindings", "yes"); //啟用鍵盤輸入 setValue("input-vo-keyboard", "yes"); //設(shè)置硬件加速 none auto any d3d11va dxva2 setOption("hwdec", hardware); //設(shè)置通信協(xié)議 tcp udp setOption("rtsp-transport", transport); //設(shè)置網(wǎng)絡(luò)超時時間 單位秒 setOption("network-timeout", 3); //初始化實例 if (mpv_initialize(mpvPlayer) < 0) { return false; } //設(shè)置保存文件,目前發(fā)現(xiàn)有部分視頻流不行,原因未知 this->initSave(); //創(chuàng)建事件管理器 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"; }
到此,關(guān)于“Qt mpv解碼播放怎么實現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。