[原創文章,轉載請註明來源,方便查看本文更新]html
這段時間須要用QT開發一個播放直播流的功能,可以播放各類格式的直播流,而且CPU佔用率不要過高(能夠佔用GPU),這些是咱們的目標。git
直播流推流的技術進展在上一篇博客中已經提到了,目前個人能力範圍內只能推送RTMP格式的連接,因此須要播放端可以解析這種格式的連接。github
下面是一張本身作的圖,對QT可調用的幾種播放方面的開源庫進行對比: web
這種方式有兩個優勢:網絡
缺點:app
代碼示例: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();
優勢:ide
缺點:測試
優勢:ui
缺點:
上圖是目前支持的平臺,連接中都是編譯過能夠直接用的庫,只須要配置到相應位置便可
(頭文件和lib庫在QT的.pro文件中添加進去便可,DLL庫須要將相應路徑添加到系統環境變量中,具體能夠參考:QT總結第3篇:如何在QT中添加.lib,.dll還有.h文件)
綜合來講較爲推薦
在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。
官方介紹:
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,我的感受沒有說的很清楚,因此寫一下本身踩過坑後的總結
參考以前個人文章:http://www.cnblogs.com/QingHuan/p/7685328.html
下載連接:https://ffmpeg.zeranoe.com/builds/
將右邊的Shared版本和Dev版本都下載下來,分別是DLL動態連接庫、頭文件和LIB。
頭文件和lib庫在QT的.pro文件中添加進去便可(第三步再進行添加),DLL庫須要將相應路徑添加到系統環境變量中,具體能夠參考:QT總結第3篇:如何在QT中添加.lib,.dll還有.h文件
Windows系統的環境變量通常在重啓後纔會生效。
頭文件和LIB文件的書寫示例:
INCLUDEPATH += D:\ffmpeg\includeLIBS += -LD:\ffmpeg\lib -lavutil -lavformat -lavcodec -lswscale
git clone https://github.com/wang-bin/QtAV.git git submodule update --init
打開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\
此時就可使用全部QT-AV的例子了,也能夠創造本身的新工程並調用它。
注意:在DEBUG模式下編譯的QT-AV只能讓一樣在DEBUG模式下編譯的工程使用,
若是你想要使用windeployqt來打包你的程序(即生成綠色無安裝版本程序),須要將QT-AV和你本身的工程都在QT Creator的release模式下進行編譯。
更多關於使用windeployqt來打包程序的細節不在此贅述。我已經將本身打包的一個程序發佈在了GITHUB上,能夠參考一下:https://github.com/zhixuanli/qt-av-stream-player
切換當前目錄到以下位置:
\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
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日,信息具備時效性~