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

时间:2022-09-10 05:47:22
使用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 feed1.ffm>                #Feed:每一个输入建立一个Feed     File tests/feed1.ffm             #Feed缓存文件     FileMaxSize 10M               #缓存文件最大值     ACL allow 127.0.0.1             #允许写入Feed的ip </Feed>  #传递实时流<Stream stream1.flv>               #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 </Stream> 
#传递本地文件<Stream stream2>  File "files/test.avi"  Format avi</Stream>   
<Stream stat.html>  #检查服务器状态,ffserver启动后,在web浏览器中输入地址:http://localhost:8090/stat.html,若能看到 ffserver Status 说明成功启动,通过内容可以看到在ffserver.conf配置的流信息等内容           Format status  </Stream>
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.FFMpe*生实时流如果传输的是本地文件,则不需要执行该步骤 a. 可以在ffmpeg.exe、ffserver.exe所在的路径下创建一个.bat文件,在里面写入:ffmpeg -i rtsp://192.168.1.111:8000 http://localhost:8090/feed1.ffmb. 也可以打开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