ffmpeg——ffserver的一個簡單demo
ffmpeg和ffserver配合使用可以實現實時的流媒體服務。
ffserver,負責響應客戶端的流媒體請求,把流媒體資料傳送給客戶端。
ffserver.conf,ffserver啟動時的配置檔案,在這個檔案中主要是對網路協議,快取檔案feed1.ffm和要傳送的流媒體檔案的格式引數做具體的設定。
feed1.ffm,可以看成是一個流媒體資料的快取檔案,ffserver啟動後會自動生成。ffmpeg把轉碼好的資料傳送給ffserver,如果沒有客戶端連線請求,ffserver把資料快取到該檔案中。
ffmpeg,負責媒體檔案的轉碼工作,把你伺服器上的源媒體檔案轉換成要傳送出去的流媒體檔案。
工作流程:
啟動ffserver,配置引數
ffserver先於ffmpeg啟動,它在啟動時需要加引數-f指定其配置檔案ffserver.conf,該配置檔案中包含埠資訊、緩衝檔案配置、傳送流配置(如編碼方式、幀率、取樣率等)。具體命令未:ffserver -f ffserver.conf啟動ffmpeg,輸入流
啟動ffmpeg,向緩衝檔案輸入資料流,該資料流可來自攝像頭,也可來自本地檔案。ffserver啟動後,緩衝檔案feed1.ffm就會被建立,feed1.ffm開始的部分已經寫入向客戶端傳送流的配置資訊(把它們理解為 feed1.ffm檔案的頭吧),在feed1.ffm做緩衝用時,這些資訊仍舊保留著。
ffmpeg啟動的一個關鍵引數是:連線過程
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 設定過小,資料丟失,將值設大一些即可。