使用FFMPEG和FFSERVER来搭建流媒体服务器

使用FFMpeg和FFServer来搭建流媒体服务器(在windows下实现)
一、基础知识
需要用到以下四个东西:
1. ffmpeg.exe
   负责媒体文件的transcode工作,把你服务器上的源媒体文件转换成要发送出去的流媒体文件。
2. ffserver.exe
   负责响应客户端的流媒体请求,把流媒体数据发送给客户端。
3. ffserver.conf
   ffserver启动时的配置文件,在这个文件中主要是对网络协议,缓存文件feed1.ffm(见下述)和要发送的流媒体文件的格式参数做具体的设定。ffserver.conf参数说明可以访问FFMPEG的官方文档查看。http://ffmpeg.org/ffserver.html
4. feed1.ffm
   可以看成是一个流媒体数据的缓存文件,ffmpeg把转码好的数据发送给ffserver,如果没有客户端连接请求,ffserver把数据缓存到该文件中。
可以在ffserver.conf文件中设置feed1.ffm文件的大小,当缓存数据超过这个大小,它会自动覆盖原始数据。

二、如何实现
1. 配置ffserver.conf文件
 下面是一个示例:
HTTPPort 8090                       #绑定端口号 
BindAddress 0.0.0.0             #绑定ip 
MaxHTTPConnections 2000         #最大HTTP连接数 
MaxClients 1000                 #最大客户端连接数 
MaxBandwidth 1000               #最大带宽 
CustomLog -                     #日志文件,“-”为直接打印 
NoDaemon                        #默认全局参数 
 
               #Feed:每一个输入建立一个Feed 
    File tests/feed1.ffm             #Feed缓存文件 
    FileMaxSize 10M               #缓存文件最大值 
    ACL allow 127.0.0.1             #允许写入Feed的ip 
 
 
#传递实时流
              #Stream:每一个广播(转换后的视频流)的转码设置项目 
    Format flv                      #视频流格式 
    Feed feed1.ffm                  #视频流的种子来源 
    VideoFrameRate 35              #视频帧频 
    VideoBitRate 128                #视频比特率 
    VideoSize 160x80                #视频帧大小 
    AVOptionVideo flags +global_header 
    AudioBitRate 24                 #音频比特率 
    AudioChannels 1                 #音频声道 
    AudioSampleRate 44100 
    AVOptionAudio flags +global_header 
 

#传递本地文件
 
File "files/test.avi"  
Format avi
 
  
 #检查服务器状态,ffserver启动后, 在web浏览器中输入地址:http://localhost:8090/stat.html, 若能看到 ffserver Status 说明成功启动,通过内容可以看到在ffserver.conf配置的流信息等内容           
Format status  

2.启动流媒体服务器
a. 可以在ffmpeg.exe、ffserver.exe所在的路径下创建一个.bat文件,在里面写入:ffserver -f ffserver.conf
b. 也可以打开cmd.exe  cd到你的 ffmpeg.exe、ffserver.exe所在的路径,输入:ffserver -f ffserver.conf
       执行完这一步,你就可以在web浏览器中输入地址:http://localhost:8090/stat.html,若能看到 ffserver Status 说明成功启动,通过内容可以看到在ffserver.conf配置的流信息等内容。
        
注意: 如果传输的是本地文件,那么到这一步就可以打开客户端(vlc)请求视频流地址:打开vlc–>File–>OpenNetwork–>URL中填写“http:// ip :8090/ stream2 ”–>Open (ip为FFserver所在主机电脑的ip,如果是本机测试可以使用localhost;stream2为 FFserver配置文件中Stream项的名字,本例中即为stream2)。

3.FFMpeg产生实时流如果传输的是本地文件,则不需要执行该步骤
a. 可以在ffmpeg.exe、ffserver.exe所在的路径下创建一个.bat文件,在里面写入:ffmpeg -i rtsp://192.168.1.111:8000 http://localhost:8090/feed1.ffm
b. 也可以打开cmd.exe  cd到你的ffmpeg.exe、ffserver.exe所在的路径,输入:ffmpeg -i rtsp://192.168.1.111:8000 http://localhost:8090/feed1.ffm
其中:
#-i:为输入参数选项
#rtsp://192.168……:为输入的RTSP视频流来源
#http://localho……:为FFserver配置文件中设置的Feed的监听地址和端口

4.实现播放
打开客户端(vlc)请求视频流地址:打开vlc–>File–>OpenNetwork–>URL中填写“http:// ip :8090/ stream1 ”–>Open (ip为FFserver所在主机电脑的ip,如果是本机测试可以使用localhost;stream2为 FFserver配置文件中Stream项的名字,本例中即为stream1)。

三、总结
ffserver先于ffmpeg启动,它在启动的时候需要加参数-f指定其配置文件。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中读取数据,发送给客户端。

本文参考资料:1.http://www.cuplayer.com/player/PlayerCode/RTSP/2014/0731/1489.html 
                                  2. http://blog.csdn.net/vblittleboy/article/details/8549835
                         3.http://ffmpeg.org/ffserver.html
                               
友情链接:FFMPEG和FFSERVER搭建流媒体服务器实例,可以根据自己的需求修改里面的ffserver.conf文件。
                   http://download.csdn.net/detail/hk627989388/9719607



你可能感兴趣的:(FFMPEG)