分享

Flex播放数据流

 xihayouyi 2012-11-02

Flex播放数据流

分类: Flex开发 220人阅读 评论(0) 收藏 举报
Adobe 公司提供了2个类:
 
NetConnection
  NetStream

音频流或视频流的一般工作流程:以下步骤简要介绍了用于发布实时音频和视频的工作流程:

  1. 创建一个 NetConnection 对象。
  2. 使用 NetConnection.connect() 方法连接到服务器上的应用程序实例。
  3. 创建一个 NetStream 对象,以便在连接中创建数据流。
  4. 使用 NetStream.attachAudio() 方法捕获音频并通过该流进行发送,然后使用 NetStream.attachCamera() 方法捕获并发送视频。
  5. 使用 NetStream.publish() 方法为该流指定唯一的名称,然后通过该流将数据发送到服务器,以使其他用户能够收到该数据。您还可以在发布数据时进行录制,以便用户可以在日后回放该数据。
NetStream:




 类在 AIR 或 Flash Player 应用程序与 Flash Media Server 之间或在 AIR 或 Flash Player 应用程序与本地文件系统之间打开单向流连接。NetStream 对象是 NetConnection 对象中的一个通道。此通道可以使用 NetStream.publish() 发布流,也可以使用 NetStream.play() 订阅发布的流并接收数据。您可以发布或播放实时数据及先前录制的数据。您还可以使用 NetStream 对象向所有已订阅的客户端发送文本消息(请参阅 NetStream.send() 方法)。

从 Flash Media Server 流、渐进式 F4V 文件或渐进式 FLV 文件中接收数据:Flash Media Server、F4V 文件和 FLV 文件可以在流处理或播放过程中发送包含特定数据点上的数据的事件对象。您可以使用两种方法在回放过程中从流或 FLV 文件中处理数据:

  • 将客户端属性与事件处理函数相关联以接收数据对象。使用 NetStream.client 属性分配对象以调用特定的数据处理函数。分配给 NetStream.client 属性的对象可以侦听以下数据点:onCuePoint()onImageData()onMetaData()onPlayStatus()onTextData()onXMPData()。然后在这些函数内编写过程,以处理在回放过程中从流或 FLV 文件中返回的数据对象。有关详细信息,请参阅 NetStream.client 属性。
  • 将客户端属性与 NetStream 类的子类相关联,然后编写事件处理函数以接收数据对象。NetStream 是一个密封类,即无法在运行时将属性或方法添加到 NetStream 对象。 然而,您可以创建 NetStream 的子类并在其中定义您的事件处理函数,或者将该子类变为动态的并对子类的实例添加事件处理函数。
attachAudio ()




指定一个通过 NetStream 对象发送的音频流,它来自作为源传递的 Microphone 对象。此方法仅可用于指定流的发布者。

attachAudio 方法用于 Flash Media Server。此方法通常是由从客户端计算机向服务器发送实时音频(或包含音频的实时视频)的用户调用的。

您可以在调用 publish() 方法并真正开始传输之前或之后,调用此方法。想要收听此音频的订阅者必须调用 NetStream.play() 方法。设置麦克风的 rate,使其与声音捕获设备的频率匹配,并通过 setSilenceLevel() 方法设置静音级别阈值。可以通过 microphone 对象的 soundTransform 属性控制此音频流的声音属性(音量和声相)。

var conn:NetConnection = new NetConnection();      conn.connect("rtmp://server.domain.com/path");      var stream:NetStream = new NetStream(conn);      var live_mic:Microphone = Microphone.get();      live_mic.rate = 8;      live_mic.setSilenceLevel(20,200);      var soundTrans:SoundTransform = new SoundTransform();      soundTrans.volume = 6;      live_mic.soundTransform = soundTrans;      stream.attachAudio(live_mic);      stream.publish("mic_stream","live")

attachCamera ()

开始从摄像头捕获视频,如果将 theCamera 设置为 null,则会停止捕获操作。此方法仅供指定的流的发布者使用。

此方法用于 Flash Media Server;有关详细信息,请参阅类说明。

在附加了视频源后,必须调用 NetStream.publish() 才能开始传输。 希望显示视频的订户必须调用 NetStream.play()Video.attachCamera() 方法,才能在舞台上显示视频。

可以使用 snapshotMilliseconds 并通过提供一个正数值,将指定毫秒数的尾片添加到视频输入信号中的方式来发送单个快照(通过提供值 0)或一系列快照(实际上是延时拍摄镜头)。尾片延长了视频消息的显示时间。通过对 snapshotMilliseconds 使用正数值来重复调用 attachCamera(),交替快照和尾片的序列将创建延时拍摄镜头。例如,可以每天捕获一个帧,将其追加到视频文件上。当订阅者播放该文件时,每个帧都会在屏幕上显示指定的毫秒数,然后才会显示下一个帧。

snapshotMilliseconds 参数的用途不同于可通过 Camera.setMode() 设置的 fps 参数。在指定 snapshotMilliseconds 时,您可以控制录制的帧之间的时间间隔。在使用 Camera.setMode() 指定 fps 时,您在控制录制和回放多长时间。

例如,假设您想每隔 5 分钟取一个快照,一共要取 100 个快照。您可以通过以下两种方式来实现:

  • 您可以每隔 5 分钟发出一个 NetStream.attachCamera(myCamera, 500) 命令,重复执行 100 次。整个录制过程将需要 500 分钟,但是产生的文件将在 50 秒内完成回放(100 个帧,帧与帧之间的时间间隔为 500 毫秒)。
  • 您可以发出一个 fps 值为 1/300(每 300 秒一次,即每 5 分钟一次)的 Camera.setMode() 命令,然后发出一个 NetStream.attachCamera(source) 命令,使摄像头连续捕捉 500 分钟的图像。产生的文件将在 500 分钟内完成回放,这与录制的时间长度相同,每个帧显示 5 分钟。

这两种方法都同样捕获了 500 个帧,并且都很有用;具体采用何种方法,主要取决于对回放的要求。例如,在第二种情况中,可以是整段时间一直在录制音频。另外,两个文件的大小也相近。

参数


theCamera:Camera — 视频传输的源。有效值为一个 Camera 对象(可开始捕获视频)和 null。如果传递 null,应用程序将停止捕获视频,并忽略发送的其他任何参数。

snapshotMilliseconds:int (default = -1) — 指定视频流是连续、单帧,还是用于创建延时拍摄的一系列单帧。
  • 如果省略此参数,应用程序将捕获所有视频,直到将 null 值传递给 attachCamera
  • 如果传递 0,应用程序将仅捕获一个视频帧。使用此值可传输先前流中的“快照”。Flash Player 或AIR 会将无效参数、负参数或非数字参数均解释为 0。
  • 如果传递了正数值,应用程序将捕获单个视频帧,然后将指定长度的停顿作为片尾追加到快照上。使用此值可实现延时拍摄效果。

play ()
public function play(... arguments):void




播放媒体文件。

有关支持的编解码器和文件格式的信息,请参阅 http://www.adobe.com/go/hardware_scaling_cnFlash Media Server 文档

若要查看视频数据,请创建一个 Video 对象,并调用 Video.attachNetStream() 方法。若要从麦克风建立音频流,请使用 NetStream.attachAudio() 方法。可以使用 Microphone 对象控制音频的某些方面。

调用 DisplayObjectContainer.addChild() 方法可将音频路由至显示列表上的某个对象。然后可以创建一个 Sound 对象来控制音频的某些方面。有关详细信息,请参阅 DisplayObjectContainer.addChild() 方法。

如果无法找到视频文件,则调度 netStatus 事件。若要停止当前播放的流,请使用 close() 方法。

在不使用 Flash Media Server 的情况下使用此方法时,有一些安全注意事项。受信任的本地沙箱或只能与远程内容交互的沙箱中的 文件可以加载并播放远程沙箱中的视频文件,但如果没有以 URL 策略文件的形式进行显式许可,则无法访问该远程文件的数据。此外,还可以在包含 SWF 内容的 HTML 页中设置 objectembed 标签的 allowNetworking 参数,以防止在 Flash Player 中运行的 SWF 文件使用此方法。

无法连接到常用的保留端口。有关已阻止的端口的完整列表,请参阅《ActionScript 3.0 编程》一书的中的“限制网络 API”。

无法连接到常用的保留端口。有关已阻止的端口的完整列表,请参阅《ActionScript 3.0 编程》一书的中的“限制网络 API”。

有关安全性的详细信息,请参阅以下部分:

  • Flash Player 开发人员中心主题:安全性
  • NetStream.checkPolicyFile 属性。

参数


... arguments — 要播放的媒体文件的位置(字符串形式)、URLRequest.url 属性或引用这二者之一的变量。在应用程序安全沙箱以外的 Flash Player 和 AIR 内容中,您可以播放与 SWF 文件存储在同一个目录或子目录中的本地视频文件,但是不能导航到更高级别的目录。

如果使用 Flash Media Server,play() 将使用以下参数:

名称 必需 说明
name:Object 必需 录制的文件的名称、NetStream.publish() 发布的实时数据的标识符或 false。如果为 false,流将停止播放并忽略任何其它参数。有关文件名语法的详细信息,请参阅此表后面的文件格式表。
start:Number 可选 开始时间(以秒为单位)。允许的值为 -2、-1、0 或正数。默认值为 -2,它先查找实时流,然后查找录制流,如果都没有找到,则打开实时流。如果为 -1,则只播放实时流。如果为 0 或正数,则播放录制流,从第 start 秒开始。
len:Number 如果指定了 start,则是可选的。 回放持续时间(以秒为单位)。允许的值为 -1、0 或正数。默认值为 -1,它一直播放完实时流或录制流。如果为 0,则播放距录制流开始处 start 秒的单个帧。如果为正数,则播放实时流或录制流 len 秒。
reset:Object 如果指定了 len,则是可选的。 是否清除播放列表。默认值为 1 或 true,它清除任何以前的 play 调用并立即播放 name。如果为 0 或 false,则将流添加到播放列表中。如果为 2,则将播放列表保持不变,并同时返回所有流消息,而不是分段返回。如果为 3,则清除播放列表,并同时返回所有流消息。

可以播放下表中所列的文件格式。语法将随文件格式的不同而不同。

文件格式 语法 示例
FLV 以字符串形式指定流名称,不带文件扩展名。 ns.play("myFLVStream");
MP3 或 ID3 以字符串形式指定流名称,使用相应的前缀 mp3:id3:,但不带文件扩展名。 ns.play("mp3:myMP3Stream"); ns.play("id3:myID3data");
基于 MPEG-4 的文件(如 F4V、MP4) 以字符串形式指定流名称,带有或不带有文件扩展名,并带有前缀 mp4:。此前缀将向 Flash Media Server 表明,该文件在 MPEG-4 Part 14 容器格式中包含 H.264 编码的视频和 AAC 编码的音频。 ns.play("mp4:myVideo.f4v") ns.play("mp4:myVideo.mp4") ns.play("mp4:myVideo")

事件

status:StatusEvent — 在尝试播放用数字权限管理 (DRM) 加密的内容时调度。code 属性的值为“DRM.encryptedFLV”

引发

SecurityError — 本地不受信任的 SWF 文件无法与 Internet 通信。您可以通过将此 SWF 文件重新分类为只能与远程内容交互或受信任来消除此限制。

ArgumentError — 至少必须指定一个参数。

Error — NetStream 对象无效。这可能是由于失败的 NetConnection 造成的。

另请参见


示例
Flash Media Server 此示例从头开始播放录制的 F4V 文件 100 秒:
ns.play("mp4:record1.f4v", 0, 100, true);
Flash Media Server 此示例从头到尾播放客户端发布的实时 FLV 流,该流立即启动并清除所有以前的流:
ns.play("stephen");


publish () 方法
public function publish(name:String = null, type:String = null):void




将音频流、视频流和文本消息流从客户端发送到 Flash Media Server,并可选择在传输期间录制该流。此方法仅供指定的流的发布者使用。

可以录制 FLV 或 MPEG-4 格式的文件。如果录制 MPEG-4 格式的文件,则必须使用 flattener 工具才能在另一个应用程序中编辑或播放该文件。若要下载此工具,请参阅 www.adobe.com/go/learn_fms_flattener_cn

请勿使用此方法播放已发布和录制的流。若要播放流,请调用 NetStream.play() 方法。

var subscribeNS:NetStream = new NetStream(myNetConnection);   subscribeNS.play("streamToPlay");
var subscribeNS = new air.NetStream(myNetConnection);   subscribeNS.play("streamToPlay");

在 Flash Media Server 录制流时,它会创建一个文件,并将其存储在服务器上应用程序目录的子目录中。每个流都存储在名称与传递给 NetConnection.connect() 的应用程序实例名称相匹配的目录中。服务器自动创建这些目录;您不必为每个应用程序实例都创建一个目录。例如,下面的代码说明了如何连接到特定应用程序实 例,该实例存储在应用程序目录下面名为 lectureSeries 的目录中。名为 lecture.flv 的文件保存在名为 /yourAppsFolder/lectureSeries/streams/Monday 的子目录中:

var myNC:NetConnection = new NetConnection();   myNC.connect("rtmp://server.domain.com/lectureSeries/Monday");   var myNS:NetStream = new NetStream(myNC);   myNS.publish("lecture", "record");
var myNC = new air.NetConnection();   myNC.connect("rtmp://server.domain.com/lectureSeries/Monday");   var myNS = new air.NetStream(myNC);   myNS.publish("lecture", "record");

下例说明如何连接到同一个应用程序的不同实例,而发出相同的发布命令。名为 lecture.flv 的文件存储在名为 /yourAppsFolder/lectureSeries/streams/Tuesday 的子目录中:

var myNC:NetConnection = new NetConnection();   myNC.connect("rtmp://server.domain.com/lectureSeries/Tuesday");   var myNS:NetStream = new NetStream(myNC);   myNS.publish("lecture", "record");
var myNC = new air.NetConnection();   myNC.connect("rtmp://server.domain.com/lectureSeries/Tuesday");   var myNS = new air.NetStream(myNC);   myNS.publish("lecture", "record");

如果不为实例名称传递一个与传递给 name 属性的值相匹配的值,则该属性将存储在名为 /yourAppsFolder/appName/streams/_definst_ 的子目录中。有关使用实例名称的详细信息,请参阅 NetConnection.connect() 方法。 有关回放视频文件的信息,请参阅 NetStream.play() 方法。

当 Flash Media Server 应用程序客户端调用 publish() 时,应用程序将收到 onPublish 事件。应用程序必须在服务器端脚本中处理该事件。要停止发布,请调用 NetStream.close()。当客户端停止发布时,应用程序将收到 onUnpublish 事件。有关详细信息,请参阅 Flash Media Server Server-Side ActionScript Language Reference(《Flash Media Server 服务器端 ActionScript 语言参考》)。

此方法可调度具有若干个不同信息对象的 netStatus 事件。例如,如果某个用户在具有指定名称的流上进行发布,则 netStatus 事件将随 NetStream.Publish.BadName 的代码属性一起调度。有关详细信息,请参阅 netStatus 事件。

参数


name:String (default = null) — 标识该流的字符串。订阅此流的客户端必须在调用 NetStream.play() 时仍然传递此名称。流名称后面不要跟“/”。例如,不要使用流名称“bolero/”。

可以发布下表所述格式的文件。语法将随文件格式的不同而不同。

文件格式 语法 示例
FLV 以字符串形式指定流名称,不带文件扩展名。 ns.publish("myFLVStream");
MP3 或 ID3 以字符串形式指定流名称,使用相应的前缀 mp3:id3:,但不带文件扩展名。 ns.publish("mp3:myMP3Stream"); ns.publish("id3:myID3data");
基于 MPEG-4 的文件(如 F4V、MP4) 以字符串形式指定流名称,带有或不带有文件扩展名,并带有前缀 mp4:。此前缀将向 Flash Media Server 表明,该文件在 MPEG-4 Part 14 容器格式中包含 H.264 编码的视频和 AAC 编码的音频。 ns.publish("mp4:myVideo.f4v") ns.publish("mp4:myVideo.mp4"); ns.publish("mp4:myVideo");

type:String (default = null) — 指定如何发布该流的字符串。有效值为“record”、“append”和“live”。默认值为“live”。
  • 如果传递“record”,则 Flash Media Server 将发布并录制实时数据,同时将录制的数据保存到名称与传递给 name 参数的值相匹配的新文件中。如果该文件存在,则覆盖该文件。
  • 如果传递“append”,则 Flash Media Server 将发布并录制实时数据,同时将录制的数据追加到名称与传递给 name 参数的值相匹配的文件中。如果未找到与 name 参数相匹配的文件,则创建一个文件。
  • 如果省略此参数或传递“live”,则 Flash Media Server 将发布实时数据,但不录制这些数据。如果存在名称与传递给 name 参数的值相匹配的文件,则删除它。
receiveAudio () 方法
public function receiveAudio(flag:Boolean):void




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

此方法主要用于 Flash Media Server;有关详细信息,请参阅类说明。

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

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

参数


flag:Boolean — 指定传入音频是在流上播放 (true) 还是不播放 (false)。默认值为 true
receiveVideo () 方法
public function receiveVideo(flag:Boolean):void




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

此方法主要用于 Flash Media Server;有关详细信息,请参阅类说明。

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

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

参数


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


NetConnection


类在 Flash Player 或 AIR AIR 应用程序和 Flash Media Server 应用程序之间或在 Flash Player 或 AIR AIR 应用程序和运行 Flash Remoting 的应用程序服务器之间创建双向连接。NetConnection 对象如同客户端与服务器之间的管道。 可使用 NetStream 对象通过此管道发送流。
采用的传输协议是:
rtmp  实时传输协议 
实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。
它有三种变种:   
1)工作在TCP之上的明文协议,使用端口1935;   
2)RTMPT封装在
HTTP请求之中,可穿越防火墙;   
3)RTMPS类似RTMPT,但使用的是HTTPS连接;

  RTMP协议是被Flash用于对象,视频,音频的传输.该协议建立在TCP协议或者轮询HTTP协议之上.
  RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是FLV中的视/音频数据.
  一个单一的连接可以通过不同的通道传输多路网络流.这些通道中的包都是按照固定大小的包传输的.  
    网络连接(Connection)  
   一个Actionscript连接并播放一个流的简单代码:   
   var videoInstance:Video = your_video_instance;  
   var nc:NetConnection = new NetConnection();   
      var connected:Boolean = nc.connect("rtmp:/localhost/myapp");
  var ns:NetStream = new NetStream(nc);
  videoInstance.attachVideo(ns);
   ns.play("flvName");
  默认端口为1935

采用的编解码方式:AMF
参考NetConnection 的两个属性:defaultObjectEncoding和objectEncoding
defaultObjectEncoding 属性
defaultObjectEncoding:uint  [读写]
语言版本:  ActionScript 3.0
运行时版本:  AIR 1.0 Flash Player 9

用于 NetConnection 对象的默认对象编码。将对象写入到二进制数据中或从二进制数据中读取对象时,defaultObjectEncoding 属性将指示对数据进行序列化处理时使用的 Action Message Format (AMF) 版本:ActionScript 3.0 格式 (ObjectEncoding.AMF3) 或 ActionScript 1.0 和 ActionScript 2.0 格式 (ObjectEncoding.AMF0)。

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

若要单独设置某个对象的编码(而非设置整个应用程序的对象编码),请改为设置 NetConnection 对象的 objectEncoding 属性。

有关详细信息,请参阅关于 objectEncoding 属性的描述。


objectEncoding 属性
objectEncoding:uint  [读写]
语言版本:  ActionScript 3.0
运行时版本:  AIR 1.0 Flash Player 9

此 NetConnection 实例的对象编码。

将对象写入到二进制数据中或从二进制数据中读取对象时,defaultObjectEncoding 属性将指示对数据进行序列化处理时应使用的 Action Message Format (AMF) 版本:ActionScript 3.0 格式 (ObjectEncoding.AMF3) 或 ActionScript 1.0 和 ActionScript 2.0 格式 (ObjectEncoding.AMF0)。可以设置 objectEncoding 属性,以便为 NetConnection 实例设置 AMF 版本。

如果应用程序需要与在 Flash Player 9 之前发布的服务器进行通信,则了解此属性非常重要。可能存在以下三种情况:

  • 连接到支持 AMF3 的服务器(如 Flex Data Services 2 或 Flash Media Server 3)。defaultObjectEncoding 的默认值是 ObjectEncoding.AMF3。在此文件中创建的所有 NetConnection 实例均使用 AMF3 序列化,因此无需设置 objectEncoding 属性。
  • 连接到不支持 AMF3 的服务器(如 Flash Media Server 2)。在这种情况下,应将静态 NetConnection.defaultObjectEncoding 属性设置为 ObjectEncoding.AMF0。在此 SWF 文件中创建的所有 NetConnection 实例均使用 AMF0 序列化。因此不必设置 objectEncoding 属性。
  • 连接到使用不同编码版本的多个服务器。不使用 defaultObjectEncoding,而是使用每个连接的 objectEncoding 属性设置每个连接的对象编码。若要连接到使用 AMF0 编码的服务器(如 Flash Media Server 2),请将其设置为 ObjectEncoding.AMF0;若要连接到使用 AMF3 编码的服务器(如 Flex Data Services 2),请将其设置为 ObjectEncoding.AMF3

在连接 NetConnection 实例后,其 objectEncoding 属性是只读的。

如果连接服务器时使用了错误的编码,则 NetConnection 对象将调度 netStatus 事件。NetStatusEvent.info 属性包含一个信息对象,此信息对象具有值为 NetConnection.Connect.Failedcode 属性,并包含说明对象编码不正确的描述。


NetConnection 中有个协议属性

protocol 属性
protocol:String  [只读 (read-only)]
语言版本:  ActionScript 3.0
运行时版本:  Flash Player 10, AIR 1.5

用于建立连接的协议。在使用 Flash Media Server 时,此属性是相关的。可能值如下:

  • "rtmp":实时消息传递协议 (RTMP)
  • "rtmpe":加密的 RTMP
  • "rtmpt":HTTP 隧道 RTMP
  • "rtmpte":HTTP 隧道加密的 RTMP
  • "rtmps":基于 HTTPS 的 RTMP
  • "rtmfp":实时媒体流协议 (RTMFP)

相关的函数还有.conect(),.call()等

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 全屏 打印 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多