ffmpeg+ffserver搭建流媒體服務器


http://blog.chinaunix.net/uid-9688646-id-3399113.html

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文件。
 
 
 
 
 
 
相關錯誤:
http://localhost:8090/test.asf: Invalid data found when processing input

Error occurs when I transcode a file into asf format

http://ffmpeg.gusari.org/viewtopic.php?f=11&t=590

You can't stream avi file format, it's not designed to be streamed, rather to be used as a file/storage format. Streaming formats are: flv, mpegts, asf, rtmp/rtp/rtsp... So, try changing Format avi to Format mpegts and see if that works. But, the most convenient way of using ffmpeg/ffserver is to create a config file for ffserver and then run ffmpeg, telling it to feed the ffserver, which will do the actual encoding and streaming.

 

 

 

 

ffmpeg與ffserver的協同工作

http://blog.csdn.net/shendan00/article/details/18839837

 

工作流程如下:

1、 啟動ffserver,配置參數

ffserver先於ffmpeg啟動,它在啟動的時候需要加參數-f指定其配置文件,配置文件里包含端口信息、緩沖文件配置、傳送流配置(如編碼方式,幀率,采樣率……)。

 

2、 啟動ffmpeg,輸入流

    啟動ffmpeg,向緩沖文件輸入數據流,數據流可以來自攝像頭,也可以來自本來就存在的文件。

feed1.ffm是一個緩沖文件,fserver啟動后,feed1.ffm就會自動被創建,feed1.ffm開始的部分已經寫入向客戶端傳送流的配置信息,在feed1.ffm做緩沖用的時候,這些信息是不會被覆蓋掉。

ffmpeg啟動的一個關鍵參數就是“http://ip:port/feed1.ffm”,其中ip是運行ffserver主機的ip,如果 ffmpeg和ffserver都在同一系統中運行的話,用localhost或者127.0.0.1也行。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用法小結 - yjlyp - 龍
 
 
 
 
 
我的配置(注意:asf文件播放不了)
 
Port 8090
RTSPPort 8091
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog -

<Feed feed1.ffm>
#File /tmp/feed1.ffm
File "/home/yingc/gcyin/test/thirdparty/output/ffmpeg/bin/feed1.ffm"
FileMaxSize 20000000K
ACL allow 127.0.0.1
</Feed>

#<Stream test.ts>
#Feed feed1.ffm
#Format mpegts
#
#AudioCodec libmp3lame
#AudioBitRate 128
#AudioChannels 2
#AudioSampleRate 44100
#AVOptionAudio flags +global_header
#
#VideoBitRate 800
#VideoFrameRate 25
#VideoSize 640x480
#VideoCodec libx264
#AVOptionVideo flags +global_header
#</Stream>
#
#<Stream test.asf>
#Feed feed1.ffm
#Format asf
#
#AudioCodec aac
#AudioBitRate 128
#AudioChannels 2
#AudioSampleRate 44100
#AVOptionAudio flags +global_header
#
#VideoBitRate 800
#VideoFrameRate 25
#VideoSize 640x480
#VideoCodec libx264
#AVOptionVideo flags +global_header
#</Stream>


<Stream test.ts>
Feed feed1.ffm
Format mpegts
</Stream>
<Stream test.avi>
Feed feed1.ffm
Format avi
</Stream>
<Stream test.flv>
Feed feed1.ffm
Format flv
</Stream>
<Stream test.mp4>
Format rtp
File "/home/yingc/gcyin/test/thirdparty/output/ffmpeg/bin/h.mp4"
</Stream>
<Stream test.asf>
Feed feed1.ffm
Format asf
</Stream>

<Stream stat.html>
Format status

# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.110.0 192.168.110.255
</Stream>

# Redirect index.html to the appropriate site
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>

 
 
./ffmpeg -i "http://122.228.84.235/d44bff3d000002EE-1400405760-3078718192/data4/vhotlx.video.qq.com/flv/173/5/p0014s3d4pb.p201.1.mp4?vkey=06C6236D18A183017BF4076DC2CCD118E4A6DCC28BAB7ECA53A48918D7D3732A6379C03F1EC5CB6FE7C901CA66638EFDB3E01647C335E225hostname=122.228.84.235" http://localhost:8090/feed1.ffm
 
 
 
./ffmpeg -i h.mp4 http://localhost:8090/feed1.ffm
 
 
 
./ffplay  http://localhost:8090/test.flv
 
./ffplay  rtsp://localhost:8091/test.flv
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM