C++ Qt實現音視頻播放功能

由於最近著手的Qt項目需要視頻播放 自己做的時候踩瞭很多坑 避免以後踩坑 故在此記錄實現過程 

Qt版本 5.9 基於C++11 Qt核心組件與附加組件安裝時請打鉤 否則可能出現項目中缺少視頻播放模塊的問題

1.首先創建一個新項目 並且打開.pro項目設置文件

創建項目

新項目目錄結構

2.在.pro文件中添加模塊 

如下所示 這是我們音視頻播放的基礎模塊 其他設置根據自己的項目需求自行添加或修改 修改完成後ctrl+s保存文件

QT += multimedia multimediawidgets
//QT += core gui是新項目默認帶的 不需要自己手動添加

添加模塊

3.接下來我們設置界面(GUI) 雙擊Forms文件夾下的.ui文件 打開GUI編輯頁面 如下

雙擊.ui文件

Push Button、Widget

我們目前不做太復雜的功能 當前僅需要Push Button和Widget兩種控件

Push Button我們用於控制播放 Widget用於顯示視頻

4.將上述兩個控件 左鍵按住不放 拖入右側窗口界面中 

將控件拖入

對控件進行一些基礎設置 為瞭增強可讀性 我這裡對控件名稱做瞭一些修改 對準需要修改的控件單擊右鍵並選擇”改變對象名稱”

左側的按鈕改名為pushButton_set 右側按鈕改名為pushButton_start

上面的框是Widget 這個控件拖進來後基本為透明狀 僅有邊框輪廓 我們改名為widget_video

ctrl+s保存文件

5.設置播放窗口

右擊剛剛拖入的Widget控件 點擊”提升為”

這裡我們需要將Widget提升為QVideoWidget

類名和頭文件都寫為QVideoWidget 選中全局包含 然後添加並提升

6.按鈕信號設置

右鍵第一個按鈕 選擇”轉到槽”

選擇clicked()並點擊下方OK按鈕

此時我們會跳轉到代碼編輯頁面

在寫代碼之前 我們還需要引入一些需要的頭文件

#include <QMediaPlaylist>
#include <QMediaPlayer>

現在我們創建一個全局的播放器變量

QMediaPlayer *player = new QMediaPlayer();

然後編寫剛剛的按鈕槽函數

void MainWindow::on_pushButton_set_clicked()
{
    player->setMedia(QMediaContent(QUrl::fromLocalFile("C:/Users/Administrator/Music/MV/test.mp4")));
//這裡的文件路徑是本地的視頻文件全路徑 根據自己的情況來設置
//player是剛剛建立的播放器變量
 
    player->setVideoOutput(ui->widget_video);
//widget_video是我們剛剛拖入的widget控件名稱
}

做完這些後你的源文件.cpp看起來應該是這樣的

註意 這裡的視頻文件路徑請根據你的視頻存放位置填寫 

如果你是從windows直接復制的路徑 那麼應該是\ 此時可能會跟C++的字符轉義符\沖突 那麼請在\前面再加上一個\ 或者將\改為/

直接復制路徑:
C:\Users\Administrator\Music\MV\test.mp4
 
修改為:
C:\\Users\\Administrator\\Music\\MV\\test.mp4
或:
C:/Users/Administrator/Music/MV/test.mp4

7.同樣照上述過程 編寫第二個按鈕的槽函數

回到.ui文件 右鍵第二個按鈕 並選擇”轉到槽” 並選擇clicked()

跳轉到槽函數編寫位置 寫入以下內容:

void MainWindow::on_pushButton_start_clicked()
{
    player->play();
}

最終完成的兩個槽函數應該是這樣的

8.編譯運行

至此主要部分已經完成 我們編譯運行軟件看看效果如何

編譯很順利 沒有Error 軟件成功運行起來瞭 出現我們剛剛編輯的窗口

至此基本播放功能實現完成 可以看到我下載到本地的MV已經播放出來瞭

9.踩坑提醒

點擊開始播放沒有反應並在Qt信息欄出現錯誤提示:DirectShowPlayerService::doRender: Unresolved error code 0x80040266

這是由於系統中不存在DirectShow解碼器 因為Qt的視頻播放控件是基於DirectShowPlayerService開發的

解決方案:安裝一個DirectShow解碼器 直接百度下載安裝一個到系統 如:LAV Filters 重新編譯運行

錯誤提示:DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80004005 ()

解決方案:將視頻文件放在全英文且無空格的路徑下 修改路徑後重新編譯運行

到此這篇關於C++ Qt實現音視頻播放的文章就介紹到這瞭,更多相關C++ Qt音視頻播放內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: