用QML實現簡單音視訊播放器的實踐
用QML的MediaPlayer控制元件配合VideoOutput對可以對音訊檔案和視訊檔案進行播放,程式碼如下:
VideoOutput {
id: video_out
anchors.fill: parent
source: mediaPlayer
}
MediaPlayer {
id: mediaPlayer
source: "file:///"+root.ctrl.srcPath
autoPlay: false
volume: voice_val.value/100
onPositionChanged: {
if ((mediaPlayer.position === mediaPlayer.duration) && (mediaPlayer.duration>0))
{
//stop
play_btn.cur_img = "./image/Chat/pause.png";
mediaPlayer.stop();
mediaPlayer.seek(0);
mediaPlayer.position = 0;
}
}
}
但是在Windows系列(Windows XP、Windows 7、Windows 8)平臺上,用QML的MediaPlayer控制元件配合VideoOutput對音訊檔案和視訊檔案進行播放,執行時會報錯:
DirectShowPlayerService::doRender: Unresolved error code 80040266
解決方法,安裝LAV Filters
Qt 中的多媒體播放,底層是使用DirectShowPlayerService,所以安裝一個DirectShow解碼器。Qt在windows上的多媒體播放功能是使用系統的DirectShow,所以安裝或者更新DirectShow解碼器就行了。
Qt在linux下使用gstreamer,Windows下使用directshow。總之,Qt沒有直接使用解碼庫,而是對平臺相關的播放器框架做了封裝,提供了平臺無關的API。gstreamer依賴
在XP下出現的問題:
當用qml的MediaPlayer在XP系統下播放視訊時,會報錯:QtMultimedia : defaultServiceProvider::requestService(): no service found for - “org.qt-project.qt.mediaplayer”.
網上的搜尋答案是:
Did you had a wmfengine.dll inside the /plugins/mediaservice directory? If yes, it means that Qt was compiled with WMF support.
If that's the case, then dsengine.dll will only contain camera support, not player support. You need to re-compile dsengine.dll with player support.
因此,需要修改部分QT原始碼,進行重新編譯生成dsengine.dll庫。
將生成的dsengined.dll拷至D:\Qt\Qt5.2.0\5.2.0\msvc2010\plugins\mediaservice替換原有檔案。然後就是安裝編解碼庫(本人用的是Lav Filters),至此,問題解決!
本人開發的播放器效果如下:
注意,在播放MP4時,有可能因為位元速率(資料速率)、幀速率的不同,播放出的某些MP4檔案可能會花屏,這是需要對其資料進行轉換,還是使用ffmpeg.exe進行轉換,命令格式如下:
ffmpeg -i aaa.mp4 -b:v 1028k output.mp4 資料速率變為 1028kbps
ffmpeg.exe -i abc.mp4 -qscale 0 -r 24 -y aaa.mp4 位元速率變為24
ffmpeg.exe -i atest.mp4 -qscale 0 -r 24 -y output.avi 格式由mp4轉換為avi
ffmpeg -i atest.mp4 -vf "transpose=1" output.mp4 將視訊旋轉90度
(注意:transpose可以旋轉,但是不能用-c:v copy,必須要重新轉碼)
以上,-i(input)後跟輸入資料檔案,-y後跟輸出檔案。轉換後用MediaPlayer對轉換後的avi進行播放,就可以完美的播放出來了。
這裡普及一些視訊的專業術語:
碼流 / 位元速率 /資料速率:碼流(Data Rate)是指視訊文件在單位時間內使用的資料流量,也叫位元速率或碼流率,通俗一點的理解就是取樣率,是視訊編碼中畫面質量控制中最重要的部分,一般我們用的單位是kb/s或者Mb/s。一般來說同樣解析度下,視訊檔案的碼流越大,壓縮比就越小,畫面質量就越高。碼流越大,說明單位時間內取樣率越大,資料流,精度就越高,處理出來的檔案就越接近原始檔案,影象質量越好,畫質越清晰,要求播放裝置的解碼能力也越高。
當然,碼流越大,檔案體積也越大,其計算公式是檔案體積=時間X位元速率/8。例如,網路上常見的一部90分鐘1Mbps碼流的720P RMVB檔案,其體積就=5400秒×1Mb/8=675MB。
幀速率:幀速率也稱為FPS(Frames PerSecond)的縮寫——幀/秒。是指每秒鐘重新整理的圖片的幀數,也可以理解為圖形處理器每秒鐘能夠重新整理幾次。越高的幀速率可以得到更流暢、更逼真的動畫。每秒鐘幀數(FPS)越多,所顯示的動作就會越流暢。
另外:在windows下,可以用system()函式執行wmplayer C:/Users/Joven/Desktop/Media/aaa.mp4開啟Windows預設的播放器進行播放。
當用qml的MediaPlayer在XP系統下播放視訊時,會報錯:QtMultimedia : defaultServiceProvider::requestService(): no service found for - “org.qt-project.qt.mediaplayer”.需要修改原始碼重新編譯Qt的QtMultimedia模組,使用重新生成的dsengine.dll。
具體修改原始碼的步驟、修改方案與輸出庫,請點選一下連結:
關注我的個人公眾號,和我一起交流成長吧: