Flash 可以提供三种完全不同的视频传送机制:渐进式下载(progressive download)、流式传输(streaming)和HTTP流式传输(HTTP streaming)。 我将利用少许代码片段简单地说明所有上述三种传送机制。如果你使用视频播放器应用程序,则这些底层的细节将是不可见的。
渐进式下载
渐进式下载是Flash提供的最简单的、因此也是使用最广泛的视频播放机制。 相应的视频文件存储于 HTTP 服务器,你需要做的所有操作是指定视频的 URL。 Flash将视频下载到浏览器的高速缓存中,然后当收到足够数量的数据时开始播放视频。
下面的范例 ActionScript 代码演示了渐进式视频播放机制:
private function playProgressive():void { var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.play("http://wwww.example.com/video.flv"); }
该方案的优点是其简单性(不需要特别的媒体流服务器)并且能够自动使用HTTP高速缓存的基础设备。该方案的不足之处是你无法控制视频下载进程、搜寻功能有限(用户无法搜寻到没有下载的视频)以及浪费带宽(整个视频能够以网络连接的最大处理速度下载,即使视频无法观看)。因此,渐进式下载仅仅适用于最简单的视频应用程序。 由于视频是通过HTTP传送的,因此需要提供内容保护机制。
YouTube 使用渐进视频下载方式以及特别的服务器侧组件来克服上述局限性。
流
流是指一种更高级的视频播放机制,利用这一机制,Flash Platform 客户端能够从特别的流服务器中获取视频数据,例如 Adobe Flash Media Server。流是使用 Real-Time Messaging Protocol (RTMP)实现的,RTMP是Adobe开发的一种开发协议。
适用于流的客户端侧 ActionScript 代码与渐进式下载的代码非常相似:
private function playStreaming():void { var nc:NetConnection = new NetConnection(); nc.connect("rtmp://example.com/video"); var ns:NetStream = new NetStream(nc); ns.play("flv:video"); }
RTMP 流的优点是能够通过对缓存和下载的完全控制以获得最佳的性能。目前,RTMP流已经能够支持快速启动(fast start)、搜寻(seeking)、技巧模式(trick mode)和多速率流(multi-bitrate streaming )等功能。 RTMP流没有浪费带宽,它只下载必需的视频数据。相应的视频数据不必写入磁盘(浏览器高速缓存器或任何其它位置),而是在收到之后由Flash进行处理。
RTMP具有多种风格:它可以在 HTTP (RTMPT) 或SSL (RTMPS)上建立通道。 Flash Media Server 也可以提供加一种密格式 (RTMPE),目前许多视频网站已经使用这种加密格式。
HTTP流
HTTP 流处理功能是最近引入Flash Player 10.1的。 它将流的高级功能与HTTP高速缓存基础设备的可用性组合在一起。 相应的视频文件存储于一个web服务器。在当前的实现方案中,复杂部分被推向视频播放器应用程序:视频下载、缓存控制、搜寻以及其它多种功能均由应用程序开发人员利用ActionScript实现。 ActionScript负责将视频消息作为一个ByteArray 提供给Flash以便进行解析、解码和显示。 相应的解析器只能读懂FLV 文件。如果你希望播放以 MPEG-4 格式编码的视频 ,你必须利用ActionScript解析MPEG-4容器,而这是非常具有挑战性的任务。 因此,作为Flash Media Server的一个组成部分,Adobe可以提供一种HTTP插件,它能够解析 MPEG-4 容器,并且能够方便地用于 HTTP 流处理功能。
下面的代码片段可以提供播放一段FLV电影的范例代码:
private var httpStream:URLStream = null; private function playHttpStreaming():void { var nc:NetConnection = new NetConnection(); nc.connect(null); var ns:NetStream = new NetStream(nc); ns.play(null); var request:URLRequest = new URLRequest("http://wwww.example.com/video.flv"); httpStream = new URLStream(); httpStream.addEventListener(ProgressEvent.PROGRESS, onData); httpStream.load(request); } private function onData(e:ProgressEvent):void { var b:ByteArray = new ByteArray(); httpStream.readBytes(b, 0, httpStream.bytesAvailable); ns.appendBytes(b); }
视频播放器的职责是实现搜寻(seeking)、播放列表(playlist)、多速率切换( multi-bitrate switching)及更多其它功能(而这些不是没有价值的功能)。例如,为了实现搜寻功能,视频播放器需要对视频消息进行缓存、跟踪可搜寻点并且在进行搜寻操作时为Flash提供合适的FLV片段。充分利用HTTP流提供的所有高级功能的最佳方法是使用 OSMF 视频播放器和 Flash Media Server HTTP 流处理功能插件。
HTTP 流处理功能的优点是能够对缓存进行全应用程序的ActionScript控制并且能够使用 HTTP 高速缓存设备。 技巧模式和多速率流能够方便地在应用程序层实现。 与渐进式播放一样,需要添加内容保护机制。
来自 <http://www.adobe.com/cn/devnet/video/articles/media-measurement-flash.html>