ffmpeg推送直播流的技術進展


 

首先安裝好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日

有兩篇文章和本文很像,可以先看一下專業人士寫的文章,可能更有幫助:

 

先放一張圖:(參考:簡書:做一款仿映客的直播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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM