
首先安裝好NGINX並打開服務 然后安裝好ffmpeg 然后參考:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28790518&id=5756446 下載並編譯m3u8-segment,什么是m3u8:https://www.zhihu.com/question/21087379、https://zh.wikipedia.org/zh-hans/M3U 在輸入 ./configure 之后遇到了和作者一樣的問題: configure: error: Package requirements (libavformat libavcodec libavutil) were not met: No package 'libavformat' found No package 'libavcodec' found No package 'libavutil' found 我們需要輸入下面的命令: sudo apt-get install libavformat-dev 然后再輸入 nake -j16,然后是sudo make install 輸入ls -lh查看當前目錄的所有文件的詳細信息,發現已經生成了 m3u9-segmenter並且其是可執行文件 如何使用,建議直接參考:https://github.com/m3u8-segmenter/m3u8-segmenter 比上面的chinaunix說的好 m3u8-segmenter已經過期了,作者也放棄了維護 新方法: 先將MP4轉為TS格式,然后切片成m3u8再推出去 https://my.oschina.net/ososchina/blog/828100 如果遇到了:Failed to open bitstream filter h264_mp4toannexb for stream 0 with codec copy: Invalid argument 則把命令中的-bsf h264_mp4toannexb參數刪除,就可以正常的轉換成TS格式了,但是只能輸出聲音流,視頻流缺失了 又兜兜轉轉,找到了一個好方法:https://github.com/videojs/videojs-contrib-hls/issues/1261 其中使用命令: ffmpeg -i input.mp4 -bsf:v h264_mp4toannexb -codec copy -hls_list_size 0 output.m3u8 可以直接把mp4完成切片TS並生成m3u8播放列表,一行搞定 然后發現HLS這種已經過時了,延時太高了(https://www.jianshu.com/p/5b1341e97757?utm_campaign=maleskine&utm_content=note&utm_medium=pc_all_hots&utm_source=recommendation) 最新的方法是HTTP+FLV 在播放端方面,QT內置的QMedia非常的智障,https://stackoverflow.com/questions/30507317/how-do-i-play-a-stream-with-qmediaplayer 打算換成Qt-vlc https://vlc-qt.tano.si/ 以后一定多用英文進行搜索……老外研究問題喜歡總結,而且總結的比較規范,前因后果各種環境和配置說的很明白 今天也算是在一天之內經歷了三代的推流技術……明天還要把QT-VLC添加到QT工程中,重構很多代碼 聽說大公司都有架構師進行整體架構,還有人專門去調查和選擇使用什么框架技術,而我這里相當於全棧工程師……從服務器推送視頻流到前端的界面顯示全包了…… 真是心累啊
對原文進行重構后:
如果你打算開發一個直播APP(從推送端到播放端),可以看一下本文
創建日期:2018年4月12日
有兩篇文章和本文很像,可以先看一下專業人士寫的文章,可能更有幫助:
- https://www.yanxurui.cc/posts/server/2017-11-25-http-flv/
- https://cloud.tencent.com/developer/article/1009863
先放一張圖:(參考:簡書:做一款仿映客的直播App?看我就夠了)
第一種方式:RTMP
如果你打算使用ffmpeg來開發一個直播流推送平台(如斗魚平台),我們先以“ffmpeg+推流”來進行搜索,得到的最多的結果(在2018年4月12日是這樣)是使用ffmpeg+rtmp來構建直播流推送平台。
這種方式非常簡單,按照教程先安裝NGINX,再安裝FFMPEG並進行某些設置即可。最終使用的推送命令可能是這樣的:
/home/yourname/ffmpeg/ffmpeg -re -stream_loop -1 -i /media/test_car.mp4 -vcodec copy -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1920x1080 -q 10 rtmp://yourip/myapp/test0
上面是推流端,而在接收端,則需要在某個播放器(VLC或者PotPlayer)中打開如下鏈接:
rtmp://yourip/myapp/test0
這種使用RTMP進行構建的方式,也是目前主流直播平台會采用的一種方式,其延時只有1~3秒,
但唯一的問題是在播放端加載的鏈接是RTMP開頭的,這種協議需要專門的庫去進行支持,
對於開發播放器十分不友好,比如QT中的QMedia就無法解析這種鏈接,只能解析HTTP開頭的鏈接
其實也有可以解析RTMP鏈接的方式,需要進一步開發,請參考:https://blog.csdn.net/fanhenghui/article/details/77864372
第二種方式:HLS
“HLS是一個由蘋果公司提出的基於HTTP的流媒體網絡傳輸協議”(參考:https://zh.wikipedia.org/zh-hans/HTTP_Live_Streaming)
如果你打算開發iOS直播應用,很可能會被強制使用這種播放格式
但是這種播放方式最大的問題是延時高,所以對直播平台的高實時性並不十分適用
第三種方式:HTTP-FLV
這種方式同樣是基於RTMP,但是使用了HTTP協議進行發送,所以在播放端會對一個HTTP鏈接進行解析(大部分播放器都可以,QT原生的也可以)
比如CCTV3的直播地址:
http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
有一位博主已經實現了這種方式並且據說被4個廠家應用了:
詳見:基於nginx-rtmp-module模塊實現的HTTP-FLV直播模塊(nginx-http-flv-module)
但是沒有放出源代碼,只給了部分代碼
根據https://www.yanxurui.cc/posts/server/2017-11-25-http-flv/的說法,目前這種HTTP-FLV的方式都是大家各自自己寫的,而原來的nginx+rtmp並不能實現HTTP+FLV。
這里有一個對HTTP+FLV的實現——flv.js:https://cloud.tencent.com/developer/article/1009863
可以作為一定的參考
下面是自己的理解:
這種方式需要首先將本地視頻文件(如一個MP4文件)轉為TS格式,
然后將TS視頻文件切分成多個小文件(同樣是TS格式結尾),並同時生成一個m3u8格式的播放列表文件
在推送時只需要將播放列表文件推送出去,播放端即可根據這個列表文件找到相應的視頻文件
有一個一行就可以搞定上面三行話的命令行:
ffmpeg -re -i /media/1.mp4 -bsf:v h264_mp4toannexb -vcodec copy -acodec aac -hls_list_size 1 -hls_wrap 10 /output/output.m3u8 -f flv rtmp://yourip/hls/artest1
根據某個博客的說法,在推流時要寫:
rtmp://yourip/hls/artest1
但是在播放端進行解析的時候可以用
http://yourip:yourport/hls/artest1.m3u8
所以就存在了一個問題,如何讓推流時的鏈接,能夠找到相應的m3u8被保存在了哪里呢?
推流鏈接中的
/output/output.m3u8
只是表示將TS進行切分后保存在這個output目錄下,並將對應的m3u8播放列表也保存到這個目錄下,
並沒有一個機制告訴播放端,如何解析那個HTTP鏈接去找到m3u8和相應的TS文件在哪里
然后再去調查,有人說將NGINX中對HTTP協議的文件加載路徑進行修改,可是修改后仍然是不行……目前卡在了這里
我在想是不是做好了m3u8和相應TS文件的映射,就可以用原有的RTMP+NGINX的方式推流出HTTP+FLV格式的直播流呢?
========= 未完待續 ===============
一些給讀者的提示:
1. m3u8-segmenter已經過時,作者自己也放棄了維護。ffmpeg已經將分割這個功能集成了,不需要再去加載額外的庫
詳見:https://github.com/m3u8-segmenter/m3u8-segmenter
2. 可以參考學習的鏈接:
推流:
[1] 直播協議 HTTP-FLV 詳解: http://akagi201.org/post/http-flv-explained/
[2] Mac搭建nginx+rtmp服務器: https://www.jianshu.com/p/02222073b3f1
QT與播放
[1] How do i play a stream with QMediaPlayer: https://stackoverflow.com/questions/30507317/how-do-i-play-a-stream-with-qmediaplayer
[2] https://github.com/vlc-qt/vlc-qt