用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依賴ffmpeg,它裏面的很多元素是基於ffmpeg實現的。因此,Linux下Qt的自帶的mediaplayer需要安裝gstreamer-0.10-ffmpeg。
在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。
具體修改源碼的步驟、修改方案與輸出庫,請點擊一下鏈接:
Qt源碼重新編譯QtMultimedia模塊解決XP播放視頻問題
關注我的個人公衆號,和我一起交流成長吧: