龙源期刊网 http://www.qikan.com.cn
基于Rtmp和Http双协议流媒体视频点播系统
作者:王旭鹏
来源:《电脑知识与技术》2011年第01期
摘要:在Asp.Net3.5框架基础上结合Actionscript3.0设计并实现了流媒体视频点播系统,并且同时支持Rtmp协议和Http协议的视频传输,详细分析了两种协议的点播原理,改进Http协议视频传输。针对视频点播设计了一种新的负载均衡方法分流视频请求,兼顾视频数据传输距离和服务器负载性能,保证流畅播放。 关键词:流媒体;Rtmp;负载均衡
中图分类号:TP37 文献标识码:A文章编号:1009-3044(2011)01-226-03 Streaming Video on Demand System on Rtmp and Http Protocols WANG Xu-peng
(College of Electronics and Information Engineering, Tongji University, Shanghai 201804, China) Abstract: Design and implement streaming video on demand system which uses Asp.Net 3.5 framework and Actionscript3.0. The System supports both Rtmp protocol and Http protocol transmission, detailed analyze the vod principal of two protocols, improve the Http protocol
transmission. For vod, introduce a new load balancing method to distribute video Requisitions. It
considers both video data transmission distance and server load performance to ensure smooth playing. Key words: streaming media; rtmp; load balancing
网络技术和通信技术的发展,拓宽了网络带宽,同时也更加丰富了网络应用。视频点播网站,网上教学正在成为新的网络宠儿。本文正是设计和实现了基于流媒体技术的医学教学视频点播系统,系统是下一代互联网的医学教学科研平台的子项目,为各高校师生提供教学服务。 1 流媒体简介
流媒体技术主要是将声音,影像,动画等数据分成一个个压缩包,向用户提供连续的,实时的传播,而不必等到整个视频文件下载完成才能观看。通过缓存技术提供流畅的视频播放,并且大大缩短了播放延迟,改善用户体验。流媒体的传输方式主要有顺序流式传输和实时流式传输。
龙源期刊网 http://www.qikan.com.cn
顺序流式传输顾名思义在连接建立后,服务器会按照数据在视频文件中存放的次序顺序发送给客户端,不会对数据做额外的处理,而且这种传输如果不加限制的话采用的是一种尽力交付的方式。由于顺序流式传输实现简单,传输协议采用Http协议即可,视频文件放在web服务器,不需要专门的流媒体服务器支持,网站和视频完全可以集成在一起。
实时流式传输要求数据传输和用户播放是同步的,视频可以实时地被观看。服务器对于数据会分成视频和音频做额外的处理,因此需要特定的流媒体服务器支持,如RealServer,Windows Media Server。本文实时流式传输协议采用Rtmp,流媒体服务器为Red5。 2 流媒体点播解决方案 2.1 流媒体点播架构
整个医学教学视频点播系统采用Asp.Net3.5框架开发完成,实现基于Rtmp和Http协议两种传输方式。服务器包括静态服务器Nginx,动态内容服务器IIS7.0,Rtmp服务器Red5。 Nginx是一款高性能web服务器,构建于最新的linux2.6内核之上,采用epoll模式来处理大规模的并发连接,并可以配置使用最新的NPTL线程库,传输效率不会随着连接的线性增长而下降,相比于其它服务器内存占用极小。Nginx主要用于处理静态页面和作为反向代理服务器,对于动态页面和视频文件的请求转发给IIS7.0处理。这样既加快了静态内容的处理速度,又保护了后台数据库的安全。
IIS7.0对于所有的请求在进入HttpRuntime时,都会经过一系列注册的Module进行过滤,最后对于特定的请求交由指定的Handle处理。系统中通过配置WebConfig文件,将基于Http协议FLV文件的请求映射给FLVHandler,该类必须实现接口IHttpHandeler。
Red5是一款开源服务器,通过对数据包进行逆向工程的研究从而实现了Rtmp协议。主要功能是处理对于流媒体视频的请求,从FLV文件中提取出视频和音频,并将其打包成消息,在同一连接上传输不同的流,并支持客户端在点播时的各种操作命令响应。
Flash播放器由ActionScript3.0编写,实现Rtmp和Http两种协议的视频请求和播放,系统提供给用户上述两种点播方案。整个播放器作为SWF文件嵌入到web浏览器中,用户只需打开网页便可观看视频,无需下载播放器。 系统通信流程图如图1。
视频文件统一为FLV格式,FLV作为目前最流行的流媒体视频格式,其形成文件小,结构简单,非常适合网络传输。FLV文件主要由一个文件头和许多Tag组成,Tag类型主要分为视频流,音频流和脚本流。由于视频信息和音频信息采用分开存放的方式,所以Tag中需要Timestap确保视频和音频同步。Tag中的数据区会指明该Tag的编码类。FLV文件格式如表1。
龙源期刊网 http://www.qikan.com.cn
2.2 Rtmp协议播放原理
Rtmp协议提供了流媒体视频的高效率传输,可以构架在Tcp协议之上。客户端与服务器维持着一个单一永久的连接,支持实时交流。Rtmp主要为多媒体视频提供多路传输和数据分包服务,不仅支持视频和音频数据实时传输,还支持RPC(远程过程调用)。视频,音频,操作命令,共享对象,控制消息和其它类型数据被打包成一个个消息,并打上时间戳用于同步,不同类型的消息在不同流上传输,多个消息流又交错复用在同一个连接上。消息包括Message头和Message主体。Message头格式如表2。
Message Stream Id主要用于在单一连接中识别不同的流,包括3个字节。Meaasge Type用于指明消息的类型,只有一个字节。类型1-7保留,用于传输控制消息,比如设置chunk大小,消息丢弃,用户控制消息等等。虽然通过设置Message Type可以将不同类型的消息在不同的流上传输,但Message也有其缺点,因此又将其分割成Chunk。分块可以将低优先级数据量大的Messag分割成小的Chunk,防止其阻塞优先级高数据量小的Message。流媒体传输的多路复用基于Message这一层,与Chunk无关。
Rtmp在建立连接时首先要进行3次握手,类似于Tcp协议,不过是为了服务器和客户端统一协议版本信息。然后建立连接,创建传输流,设置chunk大小,发送数据。在视频播放过程中,如果用户拖动进度条,便会触发seek操作,该消息会通过与视频数据不同的流发送到Red5,Red5会解析控制命令,返回用户需要的数据。
2.3 Http协议播放原理
对于Http协议请求FLV视频文件,由IIS7.0响应。默认情况,如果客户端带宽良好,则下载速度远远大于播放速度。由于要保存下载的数据量比较大,所以文件会缓存到硬盘,播放器中的加载进度条显示下载到硬盘的数据。当用户拖动播放视频时,只能播放已下载的视频信息,如果将播放进度条拖动到超过加载进度条时,则播放停止。为了解决这一问题,在IIS服务器增加专门响应FLV文件的Class,即FLVHandler。
首次请求视频文件,FLVHandler会读取服务器的视频文件通过网络输出流发送到客户端,播放器接收到视频数据后会调用回调方法onMetaData,该方法主要是从FLV文件中获取MetaData,也就是视频的基本信息,包括视频长度,帧率,实际宽度和高度等,其中还包括视频的关键帧信息。FLV的MetaData存储位置紧跟在FLV Header之后,其Tag类型也就是上文介绍FLV格式中提到的脚本流,MetaData对于视频文件并不是必须的,但是在播放过程中要显示视频时间,对视频进行拖动则需要MetaData信息。
视频拖动请求,如果拖动位置在播放器加载进度条之前,即该位置的视频数据已经下载到硬盘,则播放器会从本地硬盘读取数据进行播放。如果拖动位置数据还没有下载到硬盘,首先会从MetaData中找出距离拖动位置最近的关键帧,因为视频播放时必须从关键帧开始播放,