QT | 聊聊QT與直播流播放——從QMediaPlayer到Qt-AV

[原創文章,轉載請註明來源,方便查看本文更新]html

這段時間須要用QT開發一個播放直播流的功能,可以播放各類格式的直播流,而且CPU佔用率不要過高(能夠佔用GPU),這些是咱們的目標。git

直播流推流的技術進展在上一篇博客中已經提到了,目前個人能力範圍內只能推送RTMP格式的連接,因此須要播放端可以解析這種格式的連接。github

 

下面是一張本身作的圖,對QT可調用的幾種播放方面的開源庫進行對比: web

 

Stage1:QT原生播放方式:QT QMediaPlayer

這種方式有兩個優勢:網絡

  1. 無需額外的庫,直接可使用且實現方式簡單,已經有大量的例子
  2. CPU佔用率低,主要使用GPU

缺點:app

  1. 支持的視頻格式少,跟具體運行在哪一個操做系統上有關。在Windows上須要安裝LAVFilter等解碼器才能支持不少的播放格式
  2. 沒法打開非HTTP格式開頭的直播流連接

代碼示例:less

 1     QWidget wi;
 2     QMediaPlayer* player = new QMediaPlayer(0, QMediaPlayer::VideoSurface);
 3     QVideoWidget* vw = new QVideoWidget;
 4     QVBoxLayout* lay =  new QVBoxLayout;
 5     lay->addWidget(vw);
 6     vw->setMinimumSize(400, 300);
 7     lay->setSizeConstraint(QLayout::SetMinimumSize);
 8     wi.setLayout(lay);
 9 
10     player->setVideoOutput(vw);
11 
12     QNetworkRequest req(QUrl("http://pull-g.kktv8.com/livekktv/100987038.flv"));
13 
14     QMediaContent c(req);
15     player->setMedia(c);
16     player->play();

 

Stage2:使用OpenCV進行播放

優勢:ide

  1. 支持的播放格式多
  2. 相應的示例程序多

缺點:測試

  1. 雖然底層調用的也是ffmpeg的庫,可是OpenCV是將收到的直播流轉換成了一張一張的圖片,而後再一張一張的圖片按順序播放出來的
  2. 沒有使用GPU,只使用了CPU,會形成CPU佔用率極高(實際測試中,總能佔滿CPU)
  3. 代碼編寫麻煩

 

Stage3:使用Qt-vlc方式

優勢:ui

  1. 支持的格式衆多
  2. 能夠打開多種直播流連接

缺點:

  1. 編譯時比較麻煩

上圖是目前支持的平臺,連接中都是編譯過能夠直接用的庫,只須要配置到相應位置便可

(頭文件和lib庫在QT的.pro文件中添加進去便可,DLL庫須要將相應路徑添加到系統環境變量中,具體能夠參考:QT總結第3篇:如何在QT中添加.lib,.dll還有.h文件

綜合來講較爲推薦

 

Stage4:使用FQFlib方式

在VLC沒配置成後,就搜索"qt rtmp",找到了這個項目。這是一個正在成長中的項目,發佈日期爲2018年4月3日,距離如今僅有11天。主要是爲了實現基於FFmpeg的rtsp/rtmp網絡流媒體播放庫。

做者僅給出了相應的庫文件,以及一個基於QT的可運行在Visual Studio中的例子。

在通過嘗試使用VS運行失敗後,仍是決定使用最熟悉的QT Creator運行,而後仿照在VS平臺的例子,本身修改出來了一個例子,見GITHUB倉庫

可是這個例子能夠解析HTTP的直播連接,如CCTV1的:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8

對於RTMP的連接,雖然能夠加載,可是老是沒法解析,遂放棄FQFlib的方式,繼續尋找新方式。因而找到了QT-AV。

 

 

Stage5: Qt-AV開源項目

 

官方介紹:

QtAV is a multimedia playback library based on Qt and FFmpeg. It can help you to write a player with less effort than ever before.

QtAV has been added to FFmpeg projects page http://ffmpeg.org/projects.html

 

這個項目是2012年開始的,已經被ffmpeg官方收錄了,的確是很是的方便。

 

下面簡單寫一下在Windows系統下的Qt-AV安裝方式和使用方法,官方的文檔在這裏:https://github.com/wang-bin/QtAV/wiki/Build-QtAV,我的感受沒有說的很清楚,因此寫一下本身踩過坑後的總結

 

1. 安裝QT MSVC 2015 + VS2015

參考以前個人文章:http://www.cnblogs.com/QingHuan/p/7685328.html

 

2. 安裝ffmpeg

下載連接:https://ffmpeg.zeranoe.com/builds/

 

將右邊的Shared版本和Dev版本都下載下來,分別是DLL動態連接庫、頭文件和LIB。

頭文件和lib庫在QT的.pro文件中添加進去便可(第三步再進行添加),DLL庫須要將相應路徑添加到系統環境變量中,具體能夠參考:QT總結第3篇:如何在QT中添加.lib,.dll還有.h文件

Windows系統的環境變量通常在重啓後纔會生效。

 

頭文件和LIB文件的書寫示例:

INCLUDEPATH += D:\ffmpeg\include
LIBS += -LD:\ffmpeg\lib -lavutil -lavformat -lavcodec -lswscale

 

3. 安裝Qt-AV

  • 下載源代碼:
git clone https://github.com/wang-bin/QtAV.git
git submodule update --init

 

  • 打開QtAV.pro,在Qt-Creator中將頭文件和lib庫在.pro文件中添加進去
  • 點擊Build
  • 點擊Run,若是出現下圖則說明編譯成功

  • 將編譯後的庫放在合適的位置,使QT-AV真正的做爲庫能夠被調用

打開build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug文件夾,這個文件夾是和git clone以後的那個目錄同級的,

找到sdk_install.bat,這個腳本可以自動將相應的DLL文件複製到正確的位置,能夠看一下代碼,很容易理解:

mkdir D:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtAV\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\lib_win_x86_64\*Qt*AV*.lib* D:\Qt\Qt5.7.1\5.7\msvc2015_64\lib\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\lib_win_x86_64\QtAV1.lib D:\Qt\Qt5.7.1\5.7\msvc2015_64\lib\Qt5AV.lib
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\lib_win_x86_64\QtAVd1.lib D:\Qt\Qt5.7.1\5.7\msvc2015_64\lib\Qt5AVd.lib
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\tools\install_sdk\mkspecs\features\av.prf D:\Qt\Qt5.7.1\5.7\msvc2015_64\mkspecs\features\av.prf
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\tools\install_sdk\mkspecs\modules\qt_lib_av*.pri D:\Qt\Qt5.7.1\5.7\msvc2015_64\mkspecs\modules\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\bin\Qt*AV*.dll D:\Qt\Qt5.7.1\5.7\msvc2015_64\bin\
mkdir D:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtAVWidgets\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\lib_win_x86_64\*Qt*AV*.lib* D:\Qt\Qt5.7.1\5.7\msvc2015_64\lib\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\lib_win_x86_64\QtAVWidgets1.lib D:\Qt\Qt5.7.1\5.7\msvc2015_64\lib\Qt5AVWidgets.lib
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\lib_win_x86_64\QtAVWidgetsd1.lib D:\Qt\Qt5.7.1\5.7\msvc2015_64\lib\Qt5AVWidgetsd.lib
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\tools\install_sdk\mkspecs\features\avwidgets.prf D:\Qt\Qt5.7.1\5.7\msvc2015_64\mkspecs\features\avwidgets.prf
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\tools\install_sdk\mkspecs\modules\qt_lib_avwidgets*.pri D:\Qt\Qt5.7.1\5.7\msvc2015_64\mkspecs\modules\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\bin\Qt*AV*.dll D:\Qt\Qt5.7.1\5.7\msvc2015_64\bin\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\QtAV\tools\install_sdk\..\..\src\QtAV\*.h D:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtAV\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\QtAV\tools\install_sdk\..\..\src\QtAV\QtAV D:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtAV\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\QtAV\tools\install_sdk\..\..\widgets\QtAVWidgets\*.h D:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtAVWidgets\
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\QtAV\tools\install_sdk\..\..\widgets\QtAVWidgets\QtAVWidgets D:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtAVWidgets\
mkdir D:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtAV\5.7.1\QtAV\
xcopy /s /q /y /i C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\QtAV\tools\install_sdk\..\..\src\QtAV\private D:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtAV\private
xcopy /s /q /y /i C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\QtAV\tools\install_sdk\..\..\src\QtAV\private D:\Qt\Qt5.7.1\5.7\msvc2015_64\include\QtAV\5.7.1\QtAV\private
xcopy /s /q /y /i C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\build-QtAV-Desktop_Qt_5_7_1_MSVC2015_64bit-Debug\bin\QtAV D:\Qt\Qt5.7.1\5.7\msvc2015_64\qml\QtAV
copy /y C:\Users\Bert\Documents\Qt_Project\qt-ffmpeg\QtAV\tools\install_sdk\..\..\qml\plugins.qmltypes D:\Qt\Qt5.7.1\5.7\msvc2015_64\qml\QtAV\
View Code

 

此時就可使用全部QT-AV的例子了,也能夠創造本身的新工程並調用它。

注意:在DEBUG模式下編譯的QT-AV只能讓一樣在DEBUG模式下編譯的工程使用,

若是你想要使用windeployqt來打包你的程序(即生成綠色無安裝版本程序),須要將QT-AV和你本身的工程都在QT Creator的release模式下進行編譯。

更多關於使用windeployqt來打包程序的細節不在此贅述。我已經將本身打包的一個程序發佈在了GITHUB上,能夠參考一下:https://github.com/zhixuanli/qt-av-stream-player

 

4. 打開一個播放視頻的程序並改造它

切換當前目錄到以下位置:

\QtAV\examples\simpleplayer

點擊打開simpleplayer_sdk.pro來在QT Creator中打開這個工程,不要打開simpleplayer.pro;

 

而後找到playerwindow.cpp,將68行進行以下修改,便可打開指定直播流連接(任意ffmpeg支持的格式,RTMP也支持),而非從本地加載一個視頻

1 //    QString file = QFileDialog::getOpenFileName(0, tr("Open a video"));
2     QString file = "rtmp://live.hkstv.hk.lxdns.com/live/hks";

再編譯-運行,點擊open便可打開香港位置的這個RTMP格式的直播流

相應的源代碼和綠色版程序已經放在了個人倉庫裏:https://github.com/zhixuanli/qt-av-stream-player

 

5. 站在Qt-AV的角度看FQFlib

Qt-AV其實已經完成了FQFlib所要開發的對RTMP和RSTP格式直播流播放的支持,並且根據目前的實際測試其並不能播放RTMP(也多是我本身沒寫好)

可是在已經有輪子的狀況下,不太建議FQFlib的做者繼續從新造輪子

RTMP測試源:rtmp://live.hkstv.hk.lxdns.com/live/hks

RTSP測試源:rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov

 

多說一點:

HTTP和RTMP是直播流連接的格式,而直播流自己也有編碼格式封裝格式。編碼格式如h.264格式(也叫MPEG-4)等;封裝格式則爲MP四、WMV、FLV等。具體能夠在推流時使用不一樣的ffmpeg參數進行設置。

H.264的維基百科介紹

H.264,又稱爲MPEG-4第10部分,高級視頻編碼(英語:MPEG-4 Part 10, Advanced Video Coding,縮寫爲MPEG-4 AVC)是一種面向塊,基於運動補償的視頻編碼標準(英語:Video_coding_format) 。

MP4和MPEG4並不一樣:參考自:Difference between MPEG4 and MP4

Key difference: MPEG-4 is a method of defining compression of audio and visual digital data. MPEG-4 can be used for compression of AV data for web, as used for streaming media, for CD distribution, as well as for voice broadcast television applications. The MP4 is a container format. This means that it can be used to store audio and/or video data.

 

 

總結

綜合來講,Qt-AV給我留下的印象最好,其通過了6個年頭的發展,也有了屢次的版本迭代,已經較爲完善。

若是您想要使用QT開發功能強大,支持播放「格式」衆多且代碼簡單的播放器,很是推薦使用Qt-AV

 

本文寫於2018年4月14日,信息具備時效性~

相關文章
相關標籤/搜索