首页 > 范文大全 > 正文

基于FMS的跨平台视频传输方案的研究与实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于FMS的跨平台视频传输方案的研究与实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:随着现代网络技术的发展,基于网络的音视频应用需求越来越高,从传统的视频网站,扩展到视频会议、多媒体教学、在线医疗等诸多领域。而随着手机、平板电脑的普及,客户端设备也呈现多元化特征,所以需要一种高效高质的跨平台视频传输技术。本文讨论了在fms服务端的基础上,实现不同终端的视频推流和播放技术。与其他技术作比较,这是一个着重介绍在移动端设备通过移植ffmpeg推流,和利用HLS协议播放的方案,而PC端建议采用flex技术,最终形成一个完整、高效的跨平台视频传输技术方案

关键词:FMS 跨平台 RTMP ffmpeg HLS

中图分类号:TN919.8 文献标识码:A 文章编号:1007-9416(2016)11-0106-02

1 系统整体方案

FMS(Flash Media Service)是Adobe公司出品的流媒体服务器,同时也是极具弹性的开发环境,它提供了强大的多用户、高质量音视频功能,自适应不同的带宽环境,可用于创建多样的交互多媒体网络应用。FMS除了大量应用于各类视频网站,对视频会议、视频监控、多媒体教学等领域,也都能提供方便优质的流媒体服务。目前国内一些厂商的多媒体服务平台也是基于FMS开发的。

然而,随着Android和IOS系统停止对flash的原生支持,实现一个跨平台的统一视频服务变得困难,往往需要从底层开始自主研发,成本高且通用性差。从FMS4.5版本之后开始支持的Http Dynamic Streaming技术针对苹果的HLS方案提出了基于HTTP的流媒体传输方案,增加了对HLS协议的支持,解决了移动端播放视频格式的问题,这为FMS服务于不同的终端提供了便捷的技术支持。

具体的PC客户端仍可采用Flex技术,方便地实现视频流的上传和播放,其中视频的上传利用rtmp协议,播放采用flash技术;针对移动端视频传输,向服务器推流也必须符合rtmp协议。在android和IOS系统要实现rtmp推流有多种技术方案可选,综合考虑开发成本和视频格式的统一性,本文主要介绍利用ffmpeg原生代码,并移植到android和IOS系统的解决方案。移动端的播放则借助HLS协议,最终实现跨平台的视频传输。

2 PC端采用flex技术实现视频传输

flex同为Adobe公司的产品,结合FMS进行开发尤为简便,但需要flash技术支持。这在台式电脑操作系统中不成问题,但运用在移动端需借助Adobe AIR技术较困难,考虑到兼容性等诸多因素,使用并不广泛,所以当前在移动端不建议采用。

PC端运用Flex结合FMS实现视频点播、直播的关键代码如下:

2.1 点播服务器上的视频文件

nc.connect("rtmp:// FMS服务器IP地址:端口号/PlayStreams路径");//连接FMS

ns=new NetStream(nc);

ns.play("视频文件名",0);

2.2 向服务器推流,用于直播

nc.connect("rtmp://FMS服务器IP地址:端口号/LiveStreams路径");//连接FMS

ns=new NetStream(nc);

ns.attachCamera(cam);//调用摄像头

ns.attachAudio(mic);//调用麦克风

ns.publish(“视频流名称”,"live");

2.3 播放直播流

nc.connect("rtmp://FMS服务器IP地址:端口号/LiveStreams路径");//连接FMS

ns=new NetStream(nc);

ns.play("视频流名称");//对应于视频流端的publish("视频流名称","live").

其中nc为NetConnection类型对象,用于连接FMS;ns为NetStream类型对象,代表视频流。

3 移动端实现视频

利用FMS作为视频服务器,要求视频推流符合RTMP协议。在移动端有多种开发库可以实现,例如商业上应用比较多的vitamio、ijkplayer、ffplayer等,本质上它们都是基于ffmpeg的开源项目。直接使用这些开发库,开发周期短难度低,但技术上总受到诸多限制。所以本文介绍直接使用FFMPEG实现视频处理,而后移植到移动端操作系统中的开发方法,更加灵活可控。

3.1 ffmpeg推流

ffmpeg实现视频推流首先需指定协议,然后向服务器写入视频数据。核心函数如下:

avformat_alloc_output_context2(&outfmt_ctx, NULL, "flv", out_filename); //初始化outfmt_ctx

avformat_write_header(outfmt_ctx, NULL); //写文件头

av_interleaved_write_frame(outfmt_ctx, &pkt); //写帧,需循环执行

av_write_trailer(outfmt_ctx); //写文件尾

其中outfmt_ctx为AVFormatContext类型指针,pkt为AVPacket类型结构体, out_filename为FMS服务器地址,型如 rtmp://0.0.0.0/…/livestream。

若要从设备的摄像头和麦克风采集音视频数据,则程序需要包含libavdevice/avdevice.h文件,并利用其提供的函数实现功能。

3.2 ffmepg在android上的移植

ffmpeg用C语言编写,在android平台中使用,需先编译成.so文件,然后通过JNI(Java Native Interface)调用,JNI技术允许Java代码和其他语言写的代码(C&C++)进行交互。

编译ffmpeg可采用android NDK(Native Development Kit)编译,或在Linux操作系统中(ubuntu)直接做交叉编译。编译成功将得到libffmpeg.so、libavfilter.so、libavcodec.so、 libavfomat.so、libavdevice.so、libavuntil.so、libpostproc.so等文件。

将上述.so文件和头文件导入自己的工程中,并编写自己的C文件调用相关功能,然后配置安卓makefile文件Android.mk。在java程序中使用native?functionname(…);格式调用C文件中自己编写的函数。

3.3 ffmepg在苹果系统上的移植

3.3.1 在mac os下使用ffmpeg

在mac os下使用ffmpeg比较简单,可以直接安装。若系统已经安装好brew,只需在终端输入命令:brew install ffmpeg,等待安装结束即可。安装成功后,可使用命令行来操作,或在程序中调用。

3.3.2 编译在iOS下使用的ffmpeg library库 .m文件中调用

编译在iOS下使用的ffmpeg需使用build-ffmpeg.sh脚本文件,网上也有很多一键编译的脚本提供下载使用。但如果需要根据自己的需求对ffmpeg做相应剪裁和指定编译环境,则需要自己定制configure文件。

编译成功后,将生成我们需要的libavfilter.a、libavcodec.a、libavfomat.a、libavdevice.a、libavuntil.a 等.a静态库。如果没有指定编译环境,一般都支持armv7、armv7s、i386、x86_64、arm64等多个架构。

将编译好的静态库拖到xcode工程中,并在自己的.m文件中添加头文件引用:#include "avformat.h",就可以使用library库了。

4 移动端视频播放

在FMS4.5之前未支持HLS,实现移动端的视频播放需要rtmp协议支持,仍可采用移植ffmpeg的方法,也可利用上文提到的Vitamio等开发库。而当FMS高版本支持先进的HLS协议之后我们有了更好的选择,由于HLS数据通过HTTP协议传输,所以不用考虑防火墙或者的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率以适应不同带宽条件下的播放。

事实上,上文提到的视频开发库都同时支持rtmp协议和HLS技术。另一方面,因为现在版本的android和IOS及其浏览器都已经支持HTML5标准,在HTML5中播放HLS视频也可以非常简单的使用其video标签,所以对于客户端使用浏览器的场合,HLS视频格式显然是首选方案。而对于使用APP的客户端,不管是android还是IOS,如果想利用HTML5编写应用,除了使用开发库,还可以采用高效的混合开发方式。使用方法如下:

从播放效果看,苹果的safari运行良好,android系统还不是完全稳定,适配率不高,这和操作系统版本及使用的浏览器有关。

5 结语

经过十几年的快速发展,流媒体技术方案己经非常多样且不断发展。本文针对视频传输的跨平台需求,主要介绍了基于FMS服务器和ffmpeg移植的技术方案,实现了一个从技术难度到开发成本都相对合适的视频传输、播放系统,且能在不同带宽条件下实现视频传输质量最优。本系统可在PC、android和ios之间实现视频交互,运行效果良好,为各类应用需求提供了优质的解决方案。

参考文献

[1]何圆圆,何凯.基于FFmpeg的H.264视频解码器的研究实现[J].电脑知识与技术,2012.

[2]刘仕坤.手机平台JavaScript语言解释器设计与实现[D].中南大学,2009.

[3]周永健.基于FLEX+FMS远程交互视频教学系统与实现[D].四川师范大学,2010.

[4]张玉晴,黄瑾娉.基于HTML5的跨平台移动应用关键技术的研究与实现[J].工业控制计算机,2013,(3).

[5]胡登涛,等.编著.FLASH ACTIONSCRIPT3.0从入门到精通 [M]清华大学出版.2014-06.