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語言基于UDP協(xié)議進(jìn)行Socket編程的要點(diǎn)
這篇文章主要介紹了C語言通過UDP協(xié)議進(jìn)行Socket編程的要點(diǎn),文中還提到了相關(guān)ARP與ICMP協(xié)議的作用,需要的朋友可以參考下2016-02-02

淺談C++ Explicit Constructors(顯式構(gòu)造函數(shù))

C/C++?Qt?MdiArea?多窗體組件應(yīng)用教程

Qt一個(gè)進(jìn)程運(yùn)行另一個(gè)進(jìn)程的實(shí)現(xiàn)方法

嵌入式C語言輕量級(jí)程序架構(gòu)內(nèi)核編寫

Cocos2d-x UI開發(fā)之CCControlSlider控件類使用實(shí)例