C++?Qt實(shí)現(xiàn)音視頻播放功能
由于最近著手的Qt項(xiàng)目需要視頻播放?自己做的時(shí)候踩了很多坑?避免以后踩坑 故在此記錄實(shí)現(xiàn)過程?
Qt版本 5.9?基于C++11?Qt核心組件與附加組件安裝時(shí)請(qǐng)打鉤?否則可能出現(xiàn)項(xiàng)目中缺少視頻播放模塊的問題
1.首先創(chuàng)建一個(gè)新項(xiàng)目?并且打開.pro項(xiàng)目設(shè)置文件

新項(xiàng)目目錄結(jié)構(gòu)
2.在.pro文件中添加模塊?
如下所示?這是我們音視頻播放的基礎(chǔ)模塊?其他設(shè)置根據(jù)自己的項(xiàng)目需求自行添加或修改?修改完成后ctrl+s保存文件
QT += multimedia multimediawidgets //QT += core gui是新項(xiàng)目默認(rèn)帶的 不需要自己手動(dòng)添加

添加模塊
3.接下來我們?cè)O(shè)置界面(GUI)?雙擊Forms文件夾下的.ui文件?打開GUI編輯頁面?如下

雙擊.ui文件

Push Button、Widget
我們目前不做太復(fù)雜的功能?當(dāng)前僅需要Push Button和Widget兩種控件
Push Button我們用于控制播放 Widget用于顯示視頻
4.將上述兩個(gè)控件 左鍵按住不放?拖入右側(cè)窗口界面中?

將控件拖入
對(duì)控件進(jìn)行一些基礎(chǔ)設(shè)置?為了增強(qiáng)可讀性?我這里對(duì)控件名稱做了一些修改?對(duì)準(zhǔn)需要修改的控件單擊右鍵并選擇"改變對(duì)象名稱"
左側(cè)的按鈕改名為pushButton_set?右側(cè)按鈕改名為pushButton_start
上面的框是Widget?這個(gè)控件拖進(jìn)來后基本為透明狀?僅有邊框輪廓?我們改名為widget_video
ctrl+s保存文件
5.設(shè)置播放窗口

右擊剛剛拖入的Widget控件?點(diǎn)擊"提升為"
這里我們需要將Widget提升為QVideoWidget
類名和頭文件都寫為QVideoWidget?選中全局包含?然后添加并提升

6.按鈕信號(hào)設(shè)置

右鍵第一個(gè)按鈕?選擇"轉(zhuǎn)到槽"

選擇clicked()并點(diǎn)擊下方OK按鈕
此時(shí)我們會(huì)跳轉(zhuǎn)到代碼編輯頁面

在寫代碼之前?我們還需要引入一些需要的頭文件
#include <QMediaPlaylist> #include <QMediaPlayer>
現(xiàn)在我們創(chuàng)建一個(gè)全局的播放器變量
QMediaPlayer *player = new QMediaPlayer();
然后編寫剛剛的按鈕槽函數(shù)
void MainWindow::on_pushButton_set_clicked()
{
player->setMedia(QMediaContent(QUrl::fromLocalFile("C:/Users/Administrator/Music/MV/test.mp4")));
//這里的文件路徑是本地的視頻文件全路徑 根據(jù)自己的情況來設(shè)置
//player是剛剛建立的播放器變量
player->setVideoOutput(ui->widget_video);
//widget_video是我們剛剛拖入的widget控件名稱
}
做完這些后你的源文件.cpp看起來應(yīng)該是這樣的

注意?這里的視頻文件路徑請(qǐng)根據(jù)你的視頻存放位置填寫?
如果你是從windows直接復(fù)制的路徑?那么應(yīng)該是\?此時(shí)可能會(huì)跟C++的字符轉(zhuǎn)義符\沖突?那么請(qǐng)?jiān)赲前面再加上一個(gè)\?或者將\改為/
直接復(fù)制路徑: C:\Users\Administrator\Music\MV\test.mp4 修改為: C:\\Users\\Administrator\\Music\\MV\\test.mp4 或: C:/Users/Administrator/Music/MV/test.mp4
7.同樣照上述過程?編寫第二個(gè)按鈕的槽函數(shù)
回到.ui文件?右鍵第二個(gè)按鈕?并選擇"轉(zhuǎn)到槽"?并選擇clicked()
跳轉(zhuǎn)到槽函數(shù)編寫位置?寫入以下內(nèi)容:
void MainWindow::on_pushButton_start_clicked()
{
player->play();
}
最終完成的兩個(gè)槽函數(shù)應(yīng)該是這樣的

8.編譯運(yùn)行
至此主要部分已經(jīng)完成?我們編譯運(yùn)行軟件看看效果如何

編譯很順利?沒有Error?軟件成功運(yùn)行起來了 出現(xiàn)我們剛剛編輯的窗口

至此基本播放功能實(shí)現(xiàn)完成?可以看到我下載到本地的MV已經(jīng)播放出來了
9.踩坑提醒
點(diǎn)擊開始播放沒有反應(yīng)并在Qt信息欄出現(xiàn)錯(cuò)誤提示:DirectShowPlayerService::doRender: Unresolved error code 0x80040266
這是由于系統(tǒng)中不存在DirectShow解碼器?因?yàn)镼t的視頻播放控件是基于DirectShowPlayerService開發(fā)的
解決方案:安裝一個(gè)DirectShow解碼器?直接百度下載安裝一個(gè)到系統(tǒng)?如:LAV?Filters?重新編譯運(yùn)行
錯(cuò)誤提示:DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80004005 ()
解決方案:將視頻文件放在全英文且無空格的路徑下?修改路徑后重新編譯運(yùn)行
到此這篇關(guān)于C++ Qt實(shí)現(xiàn)音視頻播放的文章就介紹到這了,更多相關(guān)C++ Qt音視頻播放內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ virtual destructor虛擬析構(gòu)函數(shù)
C++中基類采用virtual虛析構(gòu)函數(shù)是為了防止內(nèi)存泄漏。具體地說,如果派生類中申請(qǐng)了內(nèi)存空間,并在其析構(gòu)函數(shù)中對(duì)這些內(nèi)存空間進(jìn)行釋放,今天通過本文給大家介紹C++ virtual destructor虛擬析構(gòu)函數(shù)的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-05-05
c++基礎(chǔ)算法動(dòng)態(tài)DP解決CoinChange問題
這篇文章主要為大家介紹了c++基礎(chǔ)算法如何利用動(dòng)態(tài)DP來解決Coin Change的問題示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼
今天通過本文給大家分享基于OpenCV自定義色條實(shí)現(xiàn)灰度圖上色功能代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-11-11
C++中隱式類型轉(zhuǎn)換學(xué)習(xí)筆記
在本篇文章里小編給大家整理的是一篇關(guān)于C++中隱式類型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,有興趣的跟著小編來學(xué)習(xí)下吧。2020-02-02
基于C語言實(shí)現(xiàn)靜態(tài)通訊錄的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C語言實(shí)現(xiàn)一個(gè)簡單的靜態(tài)通訊錄,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下2022-07-07

