ffserver 作爲 rtsp 服務器

ffmpeg和ffserver配合使用可以實現實時的流媒體服務,這裏實時的數據來自攝像頭,如果考慮到應用程序和網絡狀況,這裏客戶端看到的畫 面還是會落後與攝像頭本地獲取的畫面,最糟糕時甚至看不到畫面(扯遠了),這裏我們關注的是ffmpeg和ffserver之間是如何配合工作的,瞭解了 他們之間的關係,對個別問題也能有的放矢。

ffserver先於ffmpeg啓動,它在啓動的時候需要加參數-f指定其配置文件,配置文件裏包含有向客戶端傳送的流的配置(如編碼方式,幀 率,採樣率……),也有對feed1.ffm的配置,還有其他的一些配置。feed1.ffm是什麼?這裏可以理解爲一個緩衝文件,下面會提到它是如何被 用到,ffserver啓動後,feed1.ffm就會被創建,這時如果你打開feed1.ffm看看,會發現feed1.ffm開始的部分已經寫入了內 容,你可以找到關鍵字ffm以及向客戶端傳送流的配置信息,在feed1.ffm做緩衝用的時候,這些信息是不會被覆蓋掉的,就把它們理解爲 feed1.ffm文件的頭吧。

ffserver啓動後,ffmpeg啓動,它啓動時加的一個關鍵參數就是“http://ip:8090/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中讀取數據,發送給客戶端。

上面粗略的描述在實時流媒體服務時ffmpeg和ffserver的關係,這些看法都是在閱讀較早FFmpeg代碼(very old)時得出的,現在不知這個架構是否改變,兄弟我把磚扔出,希望大家用玉來砸。

http://hi.baidu.com/%D3%E5%CE%E4%CC%D5/blog/item/400f2c00b1b29697e950cded.html

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