1. 程式人生 > >ffmpeg——ffserver的一個簡單demo

ffmpeg——ffserver的一個簡單demo

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

  1. ffserver,負責響應客戶端的流媒體請求,把流媒體資料傳送給客戶端。

  2. ffserver.conf,ffserver啟動時的配置檔案,在這個檔案中主要是對網路協議,快取檔案feed1.ffm和要傳送的流媒體檔案的格式引數做具體的設定。

  3. feed1.ffm,可以看成是一個流媒體資料的快取檔案,ffserver啟動後會自動生成。ffmpeg把轉碼好的資料傳送給ffserver,如果沒有客戶端連線請求,ffserver把資料快取到該檔案中。

  4. ffmpeg,負責媒體檔案的轉碼工作,把你伺服器上的源媒體檔案轉換成要傳送出去的流媒體檔案。

工作流程:

  1. 啟動ffserver,配置引數
    ffserver先於ffmpeg啟動,它在啟動時需要加引數-f指定其配置檔案ffserver.conf,該配置檔案中包含埠資訊、緩衝檔案配置、傳送流配置(如編碼方式、幀率、取樣率等)。具體命令未:ffserver -f ffserver.conf

  2. 啟動ffmpeg,輸入流
    啟動ffmpeg,向緩衝檔案輸入資料流,該資料流可來自攝像頭,也可來自本地檔案。ffserver啟動後,緩衝檔案feed1.ffm就會被建立,feed1.ffm開始的部分已經寫入向客戶端傳送流的配置資訊(把它們理解為 feed1.ffm檔案的頭吧),在feed1.ffm做緩衝用時,這些資訊仍舊保留著。
    ffmpeg啟動的一個關鍵引數是:

    http://ip:port/feed1.ffm,其中的ip是執行ffserver主機的ip,如果ffmpeg和ffserver都在同一系統中執行的話,用localhost或者192.168.1.122也行。ffmpeg啟動後會與ffserver建立一個連線(短暫的連線),通過這第一次的連線,ffmpeg從ffserver那裡獲取了向客戶端輸出流的配置,並把這些配置作為自己編碼輸出的配置,然後ffmpeg斷開了這次連線,再次與ffserver建立連線(長久的連線),利用這個連線ffmpeg會把編碼後的資料傳送給ffserver。如果你觀察ffserver端的輸出就會發現這段時間會出現兩次HTTP的200,這就是兩次連線的過程。

  3. 連線過程
    ffmpeg從攝像頭或本地獲取資料後,按照輸出流的編碼方式編碼,然後傳送給ffserver,ffserver收到ffmpeg的資料後,如果網路上 沒有播放的請求,就把資料寫入feed1.ffm中快取,寫入時把資料加上些頭資訊然後分塊,每塊4096B(每塊也有結構),當feed1.ffm的大小到了ffserver.conf中規定的大小後,就會從檔案開始(跳過頭)寫入,覆蓋舊的資料。直到網路上有播放的請求,ffserver從 feed1.ffm中讀取資料,傳送給客戶端。

一下為一個簡單的ffserver.conf的demo:

#1.配置伺服器埠
Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 30000
CustomLog -
NoDaemon
#NoDefaults

#2.配置ffm檔案
<Feed feed1.ffm>
File /tmp/feed1.ffm #啟動ffserver後會在/tmp目錄下生成feed1.ffm檔案
FileMaxSize 100M
</Feed>

#3.配置流
<Stream test1.flv>
Feed feed1.ffm  #test1.flv對應了feed1.ffm檔案,使用ffmpeg生成feed1.ffm檔案資料後,使用ffpaly可以播放test1.flv
Format flv
</Stream>

#4.配置stat.html
<Stream stat.html>
Format status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>

1.啟動ffserver

ffserver -f ffserver.conf

ffserver started後會在/tmp/目錄下生成feed1.ffm檔案
可以在瀏覽器中檢視ffserver的情況:http://localhost:8090/stat.html (localhost為本地ip地址),該網址上有test1.flv和stat.html

2.啟動ffmpeg

ffmpeg -i tmp/test.flv http://localhost:8090/feed1.ffm
#localhost為本地ip地址,若換一臺電腦操作,則要用類似192.168.1.122的IP地址

3.訪問流

ffplay http://localhost:8090/test1.flv

使用ffplay無法播放,原因:原來的FileMaxSize 設定過小,資料丟失,將值設大一些即可。