`
Poechant
  • 浏览: 229654 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24330
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22105
社区版块
存档分类
最新评论

Introduction to Flash NetConnection/NetStream

 
阅读更多

Introduction to Flash NetConnection/NetStream

  • Author:柳大·Poechant(钟超)
  • Email:zhongchao.ustc#gmail.com(# -> @)
  • Blog:Blog.CSDN.net/Poechant
  • Date:May 28th, 2012

由于目前在研究 RTMFP 协议,及 OpenRTMFP/Cumulus 开源项目,所以不可避免的要对 Flash 客户端的 NetConnection/NetStream 有所了解。这里把它们相关的 API 做个简要介绍,并简单介绍其基本原理。具体涉及到 Flash Media Server 的部分,请参阅我发布的系列博文《OpenRTMFP/Cumulus Primer》(截至2012年5月29日,该系列博文仍在持续更新中)。

1 Introduction to NetConnection

NetConnection 就是 Flash 客户端与服务器之间进行双工传输的管道。一般来说,充当服务器角色的是 Flash Media Server(一般简称 FMS),比如 Adobe Cirrus、OpenRTMFP/Cumulus 等。当然,也可以从本地文件系统或 Web 服务器中播放视频和 MP3 文件,而不需要特殊的 FMS。

1.1 Overview

使用 NetConnection 类时,请考虑 Flash Player 安全模型,官方文档有如下描述:

如果执行调用的 SWF 文件在网络沙箱中并且要加载的声音文件是本地的,则不允许加载和播放音
频或视频文件。默认情况下,若执行调用的 SWF 是本地的并且试图加载和播放远程文件,则不允
许加载和播放音频或视频文件。 用户必须授予明确许可以允许该操作。

也就是说,SWF 文件和所欲播放的文件,在不同的位置(本地或远程服务器),则都不允许。

1.2 属性详解

1.2.1 回调谁的方法?client

client属性来指定所建立的管道(NetConnection)被远程服务器回调时,方法的所属对象。举例如下:

…
nc.client = someGuy;
…

那么之后这个 NetConnection 的远程服务器上回调someFunction方法时,就是someGuy这个对象的someFunction成员方法。其 prototype 为:

public function get client():Object 
public function set client(value:Object):void 

可能抛出的错误:

TypeError — 必须将 client 属性设置为非空对象。

1.2.2 什么编码方式?

1.2.2.1 默认编码方式defaultObjectEncoding

defaultObjectEncoding属性来指定所建立的管道的编码/解码方式,其实就是数据的序列化(对象到二进制)及反序列化(二进制到对象)的方式,在 Flash 中有 ActionScript 3.0 格式 (ObjectEncoding.AMF3) 或 ActionScript 1.0 和 ActionScript 2.0 格式 (ObjectEncoding.AMF0)。

默认值是 ObjectEncoding.AMF3。 更改 NetConnection.defaultObjectEncoding 不会影响现有 NetConnection 实例,只会影响随后创建的实例。

若要单独设置某个对象的编码(而非设置整个 SWF 文件的对象编码),请改为设置 NetConnection 对象的 objectEncoding 属性。请看 1.2.3。

其 prototype 为:

public static function get defaultObjectEncoding():uint 
public function set defaultObjectEncoding(value:uint):void 

1.2.2.2 对象编码方式objectEncoding

objectEncoding。其 prototype 为:

public function get objectEncoding():uint 
public function set objectEncoding(value:uint):void 

可能抛出的错误:

ReferenceError — 连接 NetConnection 实例时,会尝试设置 objectEncoding 属性值。
ArgumentError — 此属性被设置为 ObjectEncoding.AMF0 或 ObjectEncoding.AMF3 以外的值。

1.3 方法详解

1.3.1connect()

public function connect(command:String, ... arguments):void
  • command:String格式:

      protocol:[//host][:port]/appname[/instanceName]
    

NetConnection支持:RTMP、RTMFP。形如:

    rtmfp://127.0.0.1:1935

如果传递的command参数为null,则表示连接本地。

1.3.2call()

NetConnection调用 FMS 上的命令,在使用这个方法之前,必须先让 Flash 客户端与 FMS 建立连接,即调用connection()方法。

其 prototype 为:

public function call(command:String, responder:Responder, ... arguments):void

主要参数含义:

  • responder:Responder— 可选对象,用于处理服务器的返回值。 Responder 对象可以用两个定义的方法来处理返回的结果:result 和 status。 如果返回的结果为错误,则将调用 status;否则,将调用 result。Responder对象可以处理与特定操作有关的错误,而NetConnection对象则响应与连接状态有关的错误。

1.3.3close()

prototype:

public function close():void

1.4 相关事件

在异步引发异常(即来自本机异步代码)时调度:

flash.events.AsyncErrorEvent 

在出现输入或输出错误并导致网络操作失败时调度:

flash.events.IOErrorEvent 

在 NetConnection 对象报告其状态或错误条件时调度。 netStatus 事件包含一个 info 属性,该属性是一个包含事件特定信息(例如,连接尝试成功还是失败)的信息对象:

flash.events.NetStatusEvent 

若对 NetConnection.call() 的调用尝试连接到调用方安全沙箱外部的服务器,则进行调度:

flash.events.SecurityErrorEvent 

2 Introduction to NetStream

NetStream 对象是 NetConnection 对象中的一个通道。发布者可以通过此通道可以使用 NetStream.publish() 发布流,订阅者可以使用 NetStream.play() 订阅发布的流并接收数据,发布者还可以通过调用 NetStream.send() 对所有订阅者发布其他信息。

2.1 Overview

2.2 属性详解

2.2.1 缓冲区中的数据描述bufferLength

数据当前存在于缓冲区中的秒数。

prototype:

public function get bufferLength():Number 

2.2.2 缓冲区在播放前的缓冲值bufferTime

指定在开始显示流之前需要多长时间将消息存入缓冲区。 例如,若要确保流的最初 15 秒无中断播放,请将 bufferTime 设置为 15;Flash Player 将在把 15 秒的数据存入缓冲区后才开始播放该流。默认值是 0.1(十分之一秒)。

  • 在播放录制流时,如果 bufferTime 为 0,Flash 会将其设置为较小的值(大约为 10 毫秒)。
  • 播放实时流(例如,从播放列表中),则会永久保留此缓冲时间。 即,流的 bufferTime 始终为非零值。

prototype:

public function get bufferTime():Number 
public function set bufferTime(value:Number):void 

2.3.3 client

NetConnection的client`属性类似,用于指定在其上调用回调方法的对象。 默认对象为 this,将创建 NetStream 对象。 如果将 client 属性设置为另一个对象,则将对该对象调用回调方法。

2.3.4 objectEncoding

NetConnectionobjectEncoding类似。

2.3 方法详解

2.3.1 Constructor

创建可用于通过指定的 NetConnection 对象播放视频文件的流。

2.3.2attachAudio

指定一个通过 NetStream 对象发送的音频流,这次先看 prototype:

public function attachAudio(microphone:Microphone):void

参数:

  • microphone:Microphone— 要传输的音频流的源。

要明确:

  1. 作为源传递的是 Microphone 对象;
  2. attachAudio方法用于 FMS。
  3. 此方法通常是由从客户端计算机向服务器发送实时音频(或包含音频的实时视频)的用户调用的。
  4. 可以通过指定的 Microphone 对象的 soundTransform 属性来控制此音频流的声音属性。

2.3.3attachCamera

开始从摄像头捕获视频,如果将 theCamera 设置为 null,则会停止捕获操作。

prototype:

public function attachCamera(theCamera:Camera, snapshotMilliseconds:int = -1):void

arguments:

  • theCamera:Camera— 视频传输的源。 有效值为一个 Camera 对象(可开始捕获视频)和 null。 如果传递 null,则 Flash Player 停止捕获视频,并忽略发送的其它任何参数。
  • snapshotMilliseconds:int (default = -1)— 指定视频流是连续、单帧,还是用于创建延时拍摄的一系列单帧。

要明确:

  1. 在附加了视频源后,必须调用 NetStream.publish() 才能开始传输。
  2. 想要显示视频的订阅者必须调用 NetStream.play() 和 Video.attachCamera() 方法,才能在舞台上显示视频。

2.3.4pauseresume

public function pause():void
public function resume():void

如果当前流已暂停,则调用pause无变化,调用resume则继续。 如果当前流已在播,则调用resome无变化,调用pause则暂停。

2.3.5publishplay

public function publish(name:String = null, type:String = null):void
public function play(... arguments):void

发布者调用publish,用以向订阅者发送音视频数据,且发布时要指定名称。订阅者调用play,用以播放收到的音视频数据,且订阅时要指定名称。

  • publish参数
    • name:String (default = null)— 标识该流的字符串。 如果传递 false,则发布操作将停止。 订阅此流的客户端必须在调用 NetStream.play() 时仍然传递此名称。 不必在流名称中包含文件扩展名。 流名称后面不要跟“/”。 例如,不要使用流名称“bolero/”。
    • type:String (default = null)— 指定如何发布该流的字符串。 有效值为“record”、“append”和“live”。 默认值为“live”。
  • play参数
    • … arguments— 要播放的视频文件的位置(作为 URLRequest 对象或字符串)。 您可以播放与 SWF 文件存储于同一目录中或存储于其子目录中的本地视频文件;但不能导航到更高级别的目录。
2.3.5.1publish:发布者专用
  • 当 Flash Media Server 应用程序客户端调用 publish() 时,应用程序将收到 onPublish 事件。
  • 应用程序必须在服务器端脚本中处理该事件。 当客户端停止发布时,应用程序将收到 onUnpublish 事件。
  • 停止发布:标识该流的字符串。 如果传递 false,则发布操作将停止。
2.3.5.2play:订阅者专用
  • 无法播放:如果无法找到视频文件,则会调度 netStatus 事件。
  • 停止播放:若要停止当前播放的流,请使用 close() 方法。

2.3.7receiveAudioreceiveVideo

2.3.7.1receiveAudio:订阅者专用

receiveAudio指定传入的音频是否在流上播放。 此方法仅可用于订阅了指定流的客户端,不可用于流的发布者。

receiveAudio的 prototype:

public function receiveAudio(flag:Boolean):void

arguments:

  • flag:Boolean — 指定传入音频是在流上播放 (true) 还是不播放 (false)。 默认值为 true。

您可以在调用 NetStream.play() 方法并真正开始接收流之前或之后,调用此方法。 例如,您可以将这些方法附加到某个按钮上,用户可以通过单击该按钮将传入的音频流静音或取消静音。

如果指定的流仅包含音频数据,则将 false 值传递给该方法可以阻止 NetStream.time 进一步递增。

2.3.7.2receiveVideo:订阅者专用

指定传入的音频是否将在流上播放。 此方法仅可用于订阅了指定流的客户端,不可用于流的发布者。

receiveVideo的 prototype:

public function receiveVideo(flagOrFPS:*):void

arguments:

  • flagOrFPS:* — 指定传入视频是在此流上播放 (true) 还是不播放 (false)。 默认值是 true。 也可以使用一个整数来指定传入视频的每秒帧速率。 如果未指定帧速率,则帧速率默认为录制的视频或所播放的实时视频的帧速率。

您可以在调用 NetStream.play() 方法并真正开始接收流之前或之后,调用此方法。 例如,您可以将这些方法附加到某个按钮上,用户可以通过按该按钮来显示或隐藏传入的视频流。

如果指定的流仅包含视频数据,则将 false 值传递给该方法可以阻止 NetStream.time 进一步递增。

2.3.7send:发布者专用

  • 在发布的流上向所有订阅客户端发送一条消息。 此方法仅供指定的流的发布者使用,并与 Flash Media Server 一起使用。
  • 若要处理并响应该消息,请在 NetStream 对象上创建一个处理函数,例如,ns.HandlerName。
  • Flash Player 不对方法或方法的数据、对象原型变量或不可枚举的变量进行序列化处理。 对于显示对象,Flash Player 仅对路径而不对数据进行序列化处理。
2.3.7.1 为什么用send

您可以调用 send() 方法,将数据关键帧添加到发送给 Flash Media Server 的实时流中。 数据关键帧是发布者添加到实时流中的消息。 通常,在从摄像头和麦克风为实时流捕获数据之前,使用数据关键帧将元数据添加到该流中。 在发布实时流期间,发布者可以随时添加数据关键帧。 只要发布者连接到服务器上,就会将数据关键帧保存在服务器的内存中。

2.3.7.2 订阅者什么时候收到关键帧?

如果客户端是在添加数据关键帧之前订阅实时流的,则会在添加后立即收到该关键帧。 如果客户端是在添加数据关键帧之后订阅实时流的,则会在订阅时收到该关键帧。

2.3.7.3 怎么用?

prototype:

public function send(handlerName:String, ... arguments):void

若要将元数据关键帧添加到发送给 Flash Media Server 的实时流中,请使用 @setDataFrame 作为处理函数名称,后跟两个其它参数,例如:

var ns:NetStream = new NetStream(nc);
ns.send("@setDataFrame", "onMetaData", metaData);
  • 第一个参数:服务器端的处理函数。
  • 第二个参数:客户端被回调的函数。
  • 第三个参数开始:任意数据。

2.3.8close

停止播放流上的所有数据,将 time 属性设置为 0,并使该流可用于其它用途。 此方法还会删除通过 HTTP 下载的视频文件的本地副本。 虽然 Flash Player 删除了它所创建的文件的本地副本,但可能会在浏览器的缓存目录中永久保留一个副本。 如果必须完全禁止缓存视频文件或在本地进行存储,请使用 Flash Media Server。

  1. 如果从发布流中调用 close(),该流将停止发布,发布者现在可以将该流用于其它用途。 订阅者不再接收在该流中发布的任何内容,因为该流已停止发布。
  2. 如果从订阅流中调用 close(),该流将停止为订阅者播放,订阅者现在可以将该流用于其它用途。 其它订阅者不受影响。
  3. 您可以让订阅流停止播放,而无需使用 flash.net.NetStream.play(false) 关闭该流或更改流类型。

2.4 相关事件

在异步引发异常(即来自本机异步代码)时调度。 当服务器调用客户端上未定义的方法时调度此事件。

flash.events.AsyncErrorEvent 

在出现输入或输出错误并导致网络操作失败时调度。

flash.events.IOErrorEvent 

在 NetStream 对象报告其状态或错误条件时调度。 netStatus 事件包含一个 info 属性,该属性是一个包含有关事件特定信息(例如连接尝试成功还是失败)的信息对象。

flash.events.NetStatusEvent 

在播放视频文件期间到达嵌入的提示点时调用。

onCuePoint

在 Flash Player 接收所播放的视频文件中嵌入的描述性信息时调度。

onMetaData

在 NetStream 对象完全播放完流后调度。 此处理函数将返回信息对象,这些信息对象提供 netStatus 事件返回的信息之外的其它信息。

onPlayStatus

3 Reference

  1. http://livedocs.adobe.com/flash/9.0_cn/ActionScriptLangRefV3/flash/net/NetConnection.html
  2. http://livedocs.adobe.com/flash/9.0_cn/ActionScriptLangRefV3/flash/net/NetStream.html

-

转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant

-

分享到:
评论

相关推荐

    NetConnection_和_NetStream_

    NetConnection 和 NetStream 的状态检测 ================================================================ nc = new NetConnection(); nc.connect("rtmp://"+host+"/"+dir+"/"+name); //----------------------...

    flash+flv添加网页播放器代码

    总之,Flash+FLV的网页播放器代码涉及到ActionScript编程、NetConnection和NetStream对象的使用,以及HTML中Flash对象的嵌入。尽管HTML5视频已成为主流,但理解这种历史技术可以帮助我们更好地理解现代网页视频技术...

    RTMFP, flash to java

    综上所述,“RTMFP, flash to java”涉及的技术包括AS3的NetConnection和NetStream对象用于实现Flash端的RTMFP通信,以及Java通过第三方库实现的服务器端支持。通过这样的技术组合,可以构建出低延迟、高效率的跨...

    自己总结的netstream资料

    在实际应用中,NetStream 通常与 NetConnection 类配合使用,通过 RTMP (Real-Time Messaging Protocol) 协议来实现流媒体的传输。 #### 二、NetStream 的关键事件:onStatus 和 onMetaData ##### 2.1 NetStream....

    flash view files as3

    你可以通过`NetConnection`对象创建`NetStream`,然后将其连接到服务器上的视频源。 ```as3 var connection:NetConnection = new NetConnection(); connection.connect(null); var netStream:NetStream = new ...

    AS3.0载入flv播放并侦听.zip

    加载FLV文件通常涉及到使用Flash Player的NetConnection和NetStream类。NetConnection负责建立到服务器的连接,而NetStream则处理实际的数据传输。以下是一个基本的加载流程: 1. 创建NetConnection对象并连接到...

    flash播放器 嵌套播放flv视频 可以自己加显示文字

    netStream.play("path_to_your_flv_file.flv"); } } ``` 这段代码创建了一个`Video`对象,建立了一个`NetConnection`,并在连接成功后创建了`NetStream`。然后,它将`NetStream`附加到`Video`对象,并播放指定路径...

    jsp+flash web摄像保存图片到本地

    5. JSP与Flash交互:为了将Flash捕获的图像发送到服务器,我们可以使用Flash的NetConnection和NetStream类。NetConnection建立客户端和服务器之间的连接,而NetStream则负责数据传输。 6. JPEG编码:Flash可以将...

    h264_as3 demo

    var netStream:NetStream = new NetStream(netConnection); ``` 3. **加载H264视频**:通过`NetStream`对象的`attachBytes()`或`play()`方法,加载并播放H264编码的视频数据。 ```actionscript netStream....

    flash as3 flv播放器

    2. **NetConnection和NetStream**:`flash.net.NetConnection`用于建立与服务器的连接,而`flash.net.NetStream`则处理实际的视频流。你可以使用`NetStream.attachVideo()`方法将视频流与`Video`对象关联。 3. **...

    web 网页 直播推流 通过Flash获取,再转为RTMP

    如果使用Flash,同样需要建立NetConnection和NetStream,然后通过`NetStream.play`方法播放指定的流。 在提供的压缩包文件"rtmp-streamer-master"中,可能包含了一个实现上述流程的示例项目。这个项目可能包括了...

    yuanwenjian.rar_flash video chat

    Flash Player提供了NetConnection和NetStream类,这两个类是实现视频流传输的关键。NetConnection负责建立客户端和服务器之间的连接,而NetStream则用于在连接上发送和接收数据,包括视频和音频流。在"CameraEx.swf...

    flash网游基础通讯(FMS,JAVA)

    1. 初始化连接:Flash客户端通过创建NetConnection对象并调用connect方法连接到FMS服务器。 2. 数据传输:通过NetStream对象进行数据流的发送和接收,例如播放视频或音频,或者传递游戏状态数据。 3. 事件监听:...

    Flash AS3.0 从RTMP服务器读取视频

    首先,要实现RTMP视频流的播放,你需要理解AS3.0中的NetConnection和NetStream对象。NetConnection是与服务器建立连接的基础,而NetStream则负责处理实际的数据传输,如视频流。 1. **建立RTMP连接**: 在AS3.0中...

    FLASH___视频播放器制作过程

    1. **构建视频 NetConnection 和 NetStream**: - `NetConnection` 是AS3中的一个类,用于建立与服务器之间的连接,支持实时数据流通信,包括音频、视频和数据。 - `NetStream` 是处理网络流的类,它可以用来播放...

    flash独立视频.rar

    2. **Flash Player API**:熟悉ActionScript,Flash Player的编程语言,学习如何使用其提供的API来控制视频播放,如NetConnection和NetStream类用于网络连接和视频流处理。 3. **易语言与Flash交互**:学习如何使用...

    flash调视频flv视频播放器

    3. Flash组件:使用Flash内置的Video组件来显示视频,并配合NetConnection和NetStream类进行视频数据的加载和播放。 4. XML解析:学习如何使用ActionScript解析XML文件,获取播放列表信息,并将其应用于播放器的界面...

    基于flex的flv简易播放器

    4. **NetConnection和NetStream**:Flex中的NetConnection对象用于建立与服务器的连接,而NetStream则负责流媒体数据的传输。在播放FLV视频时,这两个对象是关键组成部分。 5. **变量定义**:_source用于存储视频源...

    flash与服务器端通信

    Flash Remoting是Flash与服务器通信的另一种常见方式,它通过NetConnection对象和NetStream对象来实现。NetConnection负责建立和管理到服务器的连接,NetStream则用于实际的数据传输。Flash Remoting支持AMF,这是一...

Global site tag (gtag.js) - Google Analytics