音频流或视频流的一般工作流程:以下步骤简要介绍了用于发布实时音频和视频的工作流程:
NetConnection.connect()
方法连接到服务器上的应用程序实例。 NetStream.attachAudio()
方法捕获音频并通过该流进行发送,然后使用 NetStream.attachCamera()
方法捕获并发送视频。 NetStream.publish()
方法为该流指定唯一的名称,然后通过该流将数据发送到服务器,以使其他用户能够收到该数据。您还可以在发布数据时进行录制,以便用户可以在日后回放该数据。 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
属性。 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 个快照。您可以通过以下两种方式来实现:
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 ) — 指定视频流是连续、单帧,还是用于创建延时拍摄的一系列单帧。
|
play | () |
public function play(... arguments):void
播放媒体文件。
有关支持的编解码器和文件格式的信息,请参阅 http://www.adobe.com/go/hardware_scaling_cn 和 Flash Media Server 文档。
若要查看视频数据,请创建一个 Video 对象,并调用 Video.attachNetStream()
方法。若要从麦克风建立音频流,请使用 NetStream.attachAudio()
方法。可以使用 Microphone 对象控制音频的某些方面。
调用 DisplayObjectContainer.addChild()
方法可将音频路由至显示列表上的某个对象。然后可以创建一个 Sound 对象来控制音频的某些方面。有关详细信息,请参阅 DisplayObjectContainer.addChild()
方法。
如果无法找到视频文件,则调度 netStatus
事件。若要停止当前播放的流,请使用 close()
方法。
在不使用 Flash Media Server 的情况下使用此方法时,有一些安全注意事项。受信任的本地沙箱或只能与远程内容交互的沙箱中的 文件可以加载并播放远程沙箱中的视频文件,但如果没有以 URL 策略文件的形式进行显式许可,则无法访问该远程文件的数据。此外,还可以在包含 SWF 内容的 HTML 页中设置 object
和 embed
标签的 allowNetworking
参数,以防止在 Flash Player 中运行的 SWF 文件使用此方法。
无法连接到常用的保留端口。有关已阻止的端口的完整列表,请参阅《ActionScript 3.0 编程》一书的中的“限制网络 API”。
无法连接到常用的保留端口。有关已阻止的端口的完整列表,请参阅《ActionScript 3.0 编程》一书的中的“限制网络 API”。
有关安全性的详细信息,请参阅以下部分:
NetStream.checkPolicyFile
属性。 参数
... arguments — 要播放的媒体文件的位置(字符串形式)、URLRequest.url 属性或引用这二者之一的变量。在应用程序安全沙箱以外的 Flash Player 和 AIR 内容中,您可以播放与 SWF 文件存储在同一个目录或子目录中的本地视频文件,但是不能导航到更高级别的目录。 如果使用 Flash Media Server,
可以播放下表中所列的文件格式。语法将随文件格式的不同而不同。
|
status: — 在尝试播放用数字权限管理 (DRM) 加密的内容时调度。code 属性的值为“DRM.encryptedFLV” 。 |
SecurityError — 本地不受信任的 SWF 文件无法与 Internet 通信。您可以通过将此 SWF 文件重新分类为只能与远程内容交互或受信任来消除此限制。 |
|
ArgumentError — 至少必须指定一个参数。 |
|
Error — NetStream 对象无效。这可能是由于失败的 NetConnection 造成的。 |
另请参见
ns.play("mp4:record1.f4v", 0, 100, true);
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/ ”。 可以发布下表所述格式的文件。语法将随文件格式的不同而不同。
|
|||||||||||||
type:String (default = null ) — 指定如何发布该流的字符串。有效值为“record ”、“append ”和“live ”。默认值为“live ”。
|
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 。 |
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 之前发布的服务器进行通信,则了解此属性非常重要。可能存在以下三种情况:
defaultObjectEncoding
的默认值是 ObjectEncoding.AMF3
。在此文件中创建的所有 NetConnection 实例均使用 AMF3 序列化,因此无需设置 objectEncoding
属性。 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.Failed
的 code
属性,并包含说明对象编码不正确的描述。
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)