ffmpeg+ffserver搭建流媒體服務器

ffmpeg和ffserver配合使用可以實現實時的流媒體服務。


一、理解

裏邊主要有如下四個東西,搞清楚他們之間的關係就差不多明白了。

1. ffmpeg


2. ffserver


3. ffserver.conf


4. feed1.ffm


 

1. ffmpeg,負責媒體文件的transcode工作,把你服務器上的源媒體文件轉換成要發送出去的流媒體文件。


2. ffserver,負責響應客戶端的流媒體請求,把流媒體數據發送給客戶端。


3. ffserver.conf,ffserver啓動時的配置文件,在這個文件中主要是對網絡協議,緩存文件feed1.ffm(見下述)和要發送的流媒體文件的格式參數做具體的設定。


4. feed1.ffm,可以看成是一個流媒體數據的緩存文件,ffmpeg把轉碼好的數據發送給ffserver,如果沒有客戶端連接請求,ffserver把數據緩存到該文件中。



二、http的建立流程

1. 配置ffserver.conf文件(初次接觸可以參考ffmpeg源碼中的doc/ffserver.conf,裏邊有詳細的註釋)

如下寫一個示例

Port 10535

RTSPPort 5454

BindAddress 0.0.0.0、

MaxHTTPConnections 2000

MaxClients 1000

MaxBandwidth 1000

CustomLog -

NoDaemon


#實時流數據配置(參考源碼ffmpeg/test/下的ffserver.conf)

<Feed feed1.ffm>

File /tmp/feed1.ffm

FileMaxSize 1M

ACL allow 127.0.0.1

</Feed>


<Stream test.avi>

Feed feed1.ffm

Format avi

#

BitExact

DctFastint

IdctSimple

VideoFrameRate 10

VideoSize 352x288

VideoBitRate 100

VideoGopSize 30

NoAudio


PreRoll 10

StartSendOnKey

MaxTime 100


</Stream>


#已經存在的文件而非實時流

 

<Stream test.flv>

File "/project/apps/ffserver/test.flv"

Format flv

</Stream>



2、如何實現播放

(1)實時流用http傳輸

如果傳輸硬盤上的文件,則:

ffserver -f myfile/ffmpeg0.8.9/ffserver.conf & ffmpeg -i inputfile(輸入文件) http://localhost:10535/feed1.ffm

如何傳輸攝像頭捕獲的實時流,則:

ffserver -f myfile/ffmpeg0.8.9/ffserver.conf & ffmpeg -f video4linux2 -framerate 30 -i /dev/video0 http://127.0.0.1:8090/feed1.ffm


啓動ffserver和ffmpeg。ffserver先於ffmpeg啓動,它在啓動的時候需要加參數-f指定其配置文件。ffserver啓動後,feed1.ffm就會被創建,這時如果你打開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。


如果你觀察ffserver端的輸出就會發現這段時間會出現兩次HTTP的200,這就是兩次連接的過程。


ffmpeg從攝像頭獲取數據後,按照輸出流的編碼方式編碼,然後發送給ffserver,ffserver收到ffmpeg的數據後,如果網絡上 沒有播放的請求,就把數據寫入feed1.ffm中緩存,寫入時把數據加上些頭信息然後分塊,每塊4096B(每塊也有結構),當feed1.ffm的大 小到了ffserver.conf中規定的大小後,就會從文件開始(跳過頭)寫入,覆蓋舊的數據。直到網絡上有播放的請求,ffserver從 feed1.ffm中讀取數據,發送給客戶端。


(2)本地文件用http傳輸

ffserver -f /etc/ffserver.conf

用命令啓動ffserver,然後用ffplay http://ip:port/test.flv,或者在vlc中輸入以上網址也可實現播放。


(3)本地文件用rtsp傳輸

ffserver -f /etc/ffserver.conf

用命令啓動ffserver,然後用ffplay rtsp://ip:port/rtsp.mpg,或者在vlc中輸入以上網址也可實現播放。

備註:在做測試的時候,用rtsp不能傳輸flv文件。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章