1. 程式人生 > >ffmpeg+ffserver搭建流媒體伺服器

ffmpeg+ffserver搭建流媒體伺服器

剛開始學習組播、直播方面的東西,簡單總結一下利用ffmpeg+ffserver做電視訊號流媒體實時直播。
總體架構就是dvb-IP閘道器將電視cable訊號解擾解複用之後,讀到ARM的記憶體緩衝區中,之後利用ffmpeg做視訊推流,ffserver作為流媒體伺服器。而在客戶端,可以通過VLC或者ffplay開啟直播視訊,也可以利用IE載入VLC activex控制元件實現網頁上播放。這樣的純HTTP播放方式,由於ts封裝在網頁實現播放可能比較麻煩,hls的實現可以參考下一篇文章《ffmpeg+nginx搭建HLS伺服器及基於ARM實現的簡單hls解決方案》

**1.視訊編碼格式、封裝格式
2.ffserver.conf
3.VLC activeX
4.實現過程**

1.視訊編碼格式、封裝格式:
AVI:可用MPEG-2, DIVX, XVID, WMV3, WMV4, WMV9, H.264
WMV:可用WMV3, WMV4, WMV9
RM/RMVB:可用RV40, RV50, RV60, RM8, RM9, RM10
MOV:可用MPEG-2, MPEG4-ASP(XVID), H.264

而目前HTML5直接可以播放的視訊封裝格式是3種:
第一,MP4,H264+AAC
第二,OGV,Ogg Theora+Ogg Vorbis
第三,WEBM,VP8

而rtmp好像只能傳輸flv和MP4視訊格式,所以對於mpeg2video編碼的視訊,直接rtmp不行,這個希望大神指教一下。

2.ffserver

ffmpeg+ffserver結構

整體結構就如上圖所示,
ffmpeg進行推流,把伺服器上的源媒體檔案轉換成要傳送出去的流媒體檔案,
ffserver則負責響應客戶端的流媒體請求,把流媒體資料傳送給客戶端。
ffserver.conf,ffserver啟動時的配置檔案,在這個檔案中主要是對網路協議,快取檔案feed1.ffm和要傳送的流媒體檔案的格式引數做具體的設定。
feed1.ffm,可以看成是一個流媒體資料的快取檔案,ffmpeg把轉碼好的資料傳送給ffserver,如果沒有客戶端連線請求,ffserver把資料快取到該檔案中。

ffserver.conf示例如下:

Port 8090
BindAddress 0.0.0.0 MaxHTTPConnections 2000 MaxClients 1000 MaxBandwidth 30000 CustomLog - NoDaemon #NoDefaults <Feed feed1.ffm> File /tmp/feed1.ffm FileMaxSize 1M ACL allow 127.0.0.1 </Feed> <Stream test1.ts> Feed feed1.ffm #File btv2.ts Format mpegts #BitExact #DctFastint #IdctSimple VideoFrameRate 25 #VideoBufferSize 4096 #VideoSize 720x576 VideoSize 1920x1080 VideoBitRate 9000 NoAudio </Stream> <Stream stat.html> Format status ACL allow localhost ACL allow 192.168.0.0 192.168.255.255 </Stream>

主要分為4個部分,伺服器埠配置,ffm配置,流配置及stat.html。
可以參考ffmpeg原始碼中的doc/ffserver.conf,裡邊有詳細的註釋

啟動ffserver和ffmpeg。ffserver先於ffmpeg啟動,它在啟動的時候需要加引數-f指定其配置檔案ffserver.conf。ffserver啟動後,feed1.ffm就會被建立,發現feed1.ffm開始的部分已經寫入了內容,可以找到關鍵字ffm以及向客戶端傳送流的配置資訊,在feed1.ffm做緩衝用的時候,這些資訊是不會被覆蓋掉的,就把它們理解為feed1.ffm檔案的頭吧。

ffserver啟動後,ffmpeg啟動,它啟動時加的一個關鍵引數就是“http://ip:10535/feed1.ffm”,其中ip是執行ffserver主機的ip,如果ffmpeg和ffserver都在同一系統中執行的話,用localhost也行。ffmpeg啟動後會與ffserver建立一個連線(短暫的連線),通過這第一次的連線,ffmpeg從ffserver那裡獲取了向客戶端輸出流的配置,並把這些配置作為自己編碼輸出的配置,然後ffmpeg斷開了這次連線,再次與ffserver建立連線(長久的連線),利用這個連線ffmpeg會把編碼後的資料傳送給ffserver。

3.VLC控制元件
ActiveX VLC Player是基於ActiveX控制元件的播放器。有VLC作支援,VLC控制元件播放支援HTTP、RTMP、HLS,而且支援MMS、RTSP以及UDP這些協議(VLC Media Player支援的協議它都支援)。
新版本VLC安裝時,會有vlc activeX控制元件安裝選項,注意一下就行了。古早版本的vlc控制元件安裝麻煩點。
但是由於ActiveX控制元件,除了IE,其他瀏覽器並不支援(自 Chrome 45 起,將不再提供 NPAPI 支援;Google和Adobe將致力於直接內建於新介面(PPAPI)的Flash功能)。

4.實現過程
ffserver先啟動起來,

ffserver -f ffserver.conf

其中的引數配置可參照上面,/tmp/feed1.ffm

ffmpeg

ffmpeg  -i output.ts http://localhost:8090/feed1.ffm

輸出的視訊地址為
http://IP:8090/test1.ts