ffmpeg+ffserver搭建流媒体服务器

刚开始学习组播、直播方面的东西,简单总结一下利用ffmpeg+ffserver做电视信号流媒体实时直播。
总体架构就是dvb-IP网关将电视cable信号解扰解复用之后,读到ARM的内存缓冲区中,之后利用ffmpeg做视频推流,ffserver作为流媒体服务器。而在客户端,可以通过VLC或者ffplay打开直播视频,也可以利用IE加载VLC activex控件实现网页上播放。这样的纯HTTP播放方式,由于ts封装在网页实现播放可能比较麻烦,hls的实现可以参考下一篇文章《ffmpeg+nginx搭建HLS服务器及基于ARM实现的简单hls解决方案》

**1.视频编码格式、封装格式
2.ffserver.conf
3.VLC activeX
4.实现过程**

1.视频编码格式、封装格式:
AVI:可用MPEG-2, DIVX, XVID, WMV3, WMV4, WMV9, H.264
WMV:可用WMV3, WMV4, WMV9
RM/RMVB:可用RV40, RV50, RV60, RM8, RM9, RM10
MOV:可用MPEG-2, MPEG4-ASP(XVID), H.264

而目前HTML5直接可以播放的视频封装格式是3种:
第一,MP4,H264+AAC
第二,OGV,Ogg Theora+Ogg Vorbis
第三,WEBM,VP8

而rtmp好像只能传输flv和MP4视频格式,所以对于mpeg2video编码的视频,直接rtmp不行,这个希望大神指教一下。

2.ffserver

ffmpeg+ffserver结构

整体结构就如上图所示,
ffmpeg进行推流,把服务器上的源媒体文件转换成要发送出去的流媒体文件,
ffserver则负责响应客户端的流媒体请求,把流媒体数据发送给客户端。
ffserver.conf,ffserver启动时的配置文件,在这个文件中主要是对网络协议,缓存文件feed1.ffm和要发送的流媒体文件的格式参数做具体的设定。
feed1.ffm,可以看成是一个流媒体数据的缓存文件,ffmpeg把转码好的数据发送给ffserver,如果没有客户端连接请求,ffserver把数据缓存到该文件中。

ffserver.conf示例如下:

Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 30000
CustomLog -
NoDaemon
#NoDefaults

<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 1M
ACL allow 127.0.0.1
</Feed>

<Stream test1.ts>
Feed feed1.ffm
#File btv2.ts 
Format mpegts
#BitExact
#DctFastint
#IdctSimple
VideoFrameRate 25
#VideoBufferSize 4096
#VideoSize 720x576
VideoSize 1920x1080
VideoBitRate 9000
NoAudio
</Stream>

<Stream stat.html>
Format status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>

主要分为4个部分,服务器端口配置,ffm配置,流配置及stat.html。
可以参考ffmpeg源码中的doc/ffserver.conf,里边有详细的注释

启动ffserver和ffmpeg。ffserver先于ffmpeg启动,它在启动的时候需要加参数-f指定其配置文件ffserver.conf。ffserver启动后,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。

3.VLC控件
ActiveX VLC Player是基于ActiveX控件的播放器。有VLC作支持,VLC控件播放支持HTTP、RTMP、HLS,而且支持MMS、RTSP以及UDP这些协议(VLC Media Player支持的协议它都支持)。
新版本VLC安装时,会有vlc activeX控件安装选项,注意一下就行了。古早版本的vlc控件安装麻烦点。
但是由于ActiveX控件,除了IE,其他浏览器并不支持(自 Chrome 45 起,将不再提供 NPAPI 支持;Google和Adobe将致力于直接内建于新接口(PPAPI)的Flash功能)。

所以网页播放提供一下几种播放器,参考大神的文章:http://blog.csdn.net/leixiaohua1020/article/details/43936415

4.实现过程
ffserver先启动起来,

ffserver -f ffserver.conf

其中的参数配置可参照上面,/tmp/feed1.ffm

ffmpeg

ffmpeg  -i output.ts http://localhost:8090/feed1.ffm

输出的视频地址为
http://IP:8090/test1.ts

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页