用QML實現簡單音視頻播放器的實踐

QMLMediaPlayer控件配合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 XPWindows 7Windows 8)平臺上,用QMLMediaPlayer控件配合VideoOutput對音頻文件和視頻文件進行播放,運行時會報錯:
DirectShowPlayerService::doRender: Unresolved error code 80040266
解決方法,安裝LAV Filters

Qt 中的多媒體播放,底層是使用DirectShowPlayerService,所以安裝一個DirectShow解碼器Qtwindows上的多媒體播放功能是使用系統的DirectShow,所以安裝或者更新DirectShow解碼器就行了。

 

Qtlinux下使用gstreamerWindows下使用directshow。總之,Qt沒有直接使用解碼庫,而是對平臺相關的播放器框架做了封裝,提供了平臺無關的APIgstreamer依賴ffmpeg,它裏面的很多元素是基於ffmpeg實現的因此,LinuxQt的自帶的mediaplayer需要安裝gstreamer-0.10-ffmpeg

 

XP下出現的問題:

當用qmlMediaPlayerXP系統下播放視頻時,會報錯: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,必須要重新轉碼)

以上,-iinput)後跟輸入數據文件,-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默認的播放器進行播放。


當用qmlMediaPlayerXP系統下播放視頻時,會報錯:QtMultimedia : defaultServiceProvider::requestService(): no service found for - “org.qt-project.qt.mediaplayer”.需要修改源碼重新編譯QtQtMultimedia模塊,使用重新生成的dsengine.dll。

具體修改源碼的步驟、修改方案與輸出庫,請點擊一下鏈接:

Qt源碼重新編譯QtMultimedia模塊解決XP播放視頻問題


關注我的個人公衆號,和我一起交流成長吧:



發佈了58 篇原創文章 · 獲贊 83 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章