Flash流式视频提示点及回调函数

流式传输视频文件

若要流式传输 Flash Media Server 中的文件,可以使用 NetConnection 和 NetStream 类连接到远程服务器实例并播放指定的流。要指定实时消息传递协议 (RTMP) 服务器,请向 
NetConnection.connect()
方法传递所需的 RTMP URL(例如“rtmp://localhost/appName/appInstance”),而不传递 
null
。若要播放指定 Flash Media Server 中的指定实时流或录制流,请为 
NetStream.play()
方法传递一个由 
NetStream.publish()
发布的实时数据的标识名称,或一个要回放的录制文件名称。有关详细信息,请参阅 Flash Media Server 文档。


了解提示点

并非所有 FLV 文件都包含提示点。虽然有在现有 FLV 文件中嵌入提示点的工具,但提示点通常是在 FLV 编码过程中嵌入在 FLV 文件中的。

您可以对 Flash 视频使用几种不同类型的提示点。可以使用 ActionScript 与在创建 FLV 文件时嵌入到 FLV 文件中的提示点进行交互,也可以与用 ActionScript 创建的提示点进行交互。


导航提示点:您可以在编码 FLV 文件时,将导航提示点嵌入到 FLV 流和 FLV 元数据包中。使用导航提示点可以使用户搜索到文件的指定部分。 
事件提示点:您可以在编码 FLV 文件时,将事件提示点嵌入到 FLV 流和 FLV 元数据包中。还可以编写代码来处理在 FLV 回放期间于指定点上触发的事件。 
ActionScript 提示点:使用 ActionScript 代码创建的外部提示点。您可以编写代码来触发这些与视频回放有关的提示点。这些提示点的精确度要低于嵌入的提示点(最高时相差 1/10 秒),因为视频播放器单独跟踪这些提示点。 

由于导航提示点会在指定的提示点位置创建一个关键帧,因此可以使用代码将视频播放器的播放头移动到该位置。您可以在 FLV 文件中设置一些特殊点,让用户搜索这些点。例如,视频可能会具有多个章节或段,在这种情况下您就可以在视频文件中嵌入导航提示点,以此方式来控制视频。

如果您计划创建一个应用程序,希望用户能在其中导航至提示点,则应在编码文件时创建并嵌入提示点,而不应使用 ActionScript 提示点。您应将提示点嵌入到 FLV 文件中,因为这些提示点需要更加精确的处理。有关在 FLV 文件中嵌入提示点的详细信息,请参阅《使用 Flash》中的“嵌入提示点”

您可以通过编写 ActionScript 来访问提示点参数。提示点参数是从 
onCuePoint
回调处理函数接收的事件对象的一部分。

若要在视频到达特定提示点时在代码中触发特定动作,请使用 
NetStream.onCuePoint
事件处理函数。有关详细信息,请参阅为 onCuePoint 和 onMetaData 编写回调方法

为 onCuePoint 和 onMetaData 编写回调方法

当播放器到达特定提示点或收到特定元数据时,您可以在应用程序中触发动作。若要触发此类动作,请使用 
onCuePoint
和 
onMetaData
事件处理函数。必须为这些处理函数编写回调方法,否则,Flash Player 可能会引发错误。例如,以下代码播放 SWF 文档所在文件夹中名为 video.flv 的 FLV 文件:


var nc:NetConnection = new NetConnection();  nc.connect(null);    var ns:NetStream = new NetStream(nc);  ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);  ns.play("video.flv");  function asyncErrorHandler(event:AsyncErrorEvent):void  {      trace(event.text);  }    var vid:Video = new Video();  vid.attachNetStream(ns);  addChild(vid);


上面的代码加载一个名为 video.flv 的本地 FLV 文件并侦听要调度的 
asyncError
(
AsyncErrorEvent.ASYNC_ERROR
)。当本机异步代码中引发异常时调度此事件。在本例中,当 FLV 中包含元数据或提示点信息,并且未定义相应的侦听器时调度此事件。如果您对视频文件的元数据或提示点信息不感兴趣,则可以使用上面的代码处理 
asyncError
事件并忽略错误。如果 FLV 中具有元数据或多个提示点,则会输出以下信息:


错误 #2095: flash.net.NetStream 无法调用回调 onMetaData。  错误 #2095: flash.net.NetStream 无法调用回调 onCuePoint。  错误 #2095: flash.net.NetStream 无法调用回调 onCuePoint。  错误 #2095: flash.net.NetStream 无法调用回调 onCuePoint。


发生错误的原因是 NetStream 对象找不到 
onMetaData
或 
onCuePoint
回调方法。在应用程序中定义这些回调方法有多种方式:


将 NetStream 对象的 client 属性设置为一个 Object 
创建自定义类并定义用于处理回调方法的方法 
扩展 NetStream 类并添加处理回调方法的方法 
扩展 NetStream 类并使其为动态类 
将 NetStream 对象的 client 属性设置为 this 
子主题

将 NetStream 对象的 client 属性设置为一个 Object
创建自定义类并定义用于处理回调方法的方法
扩展 NetStream 类并添加处理回调方法的方法
扩展 NetStream 类并使其为动态类
将 NetStream 对象的 client 属性设置为 this

将 NetStream 对象的 client 属性设置为一个 Object

通过将 
client
属性设置为一个 Object 或设置为 NetStream 的一个子类,可以重新发送 
onMetaData
和 
onCuePoint
回调方法或彻底忽略这些方法。以下示例演示如何使用空的 Object 忽略这些回调方法而不侦听 
asyncError
事件:

 

var nc:NetConnection = new NetConnection  ;
nc.connect(null);
var customClient:Object = new Object  ;
var ns:NetStream = new NetStream(nc);
ns.client = customClient;
ns.play("video.flv");
var vid:Video = new Video  ;
vid.attachNetStream(ns);
addChild(vid);
如果想要侦听 
onMetaData
或 
onCuePoint
回调方法,则需要定义用于处理这些回调方法的方法,如以下代码片断所示:
var customClient:Object = new Object  ;
customClient.onMetaData = metaDataHandler;
function metaDataHandler(infoObject:Object):void {
	trace("metadata");
}
上面的代码侦听 

onMetaData
回调方法并调用 
metaDataHandler()
方法,后者会输出一个字符串。如果 Flash Player 遇到一个提示点,那么即使未定义 
onCuePoint
回调方法,也不会生成错误。


创建自定义类并定义用于处理回调方法的方法

以下代码将 NetStream 对象的 
client
属性设置为一个自定义类 CustomClient,该类为回调方法定义处理函数:

 

var nc:NetConnection = new NetConnection  ;
nc.connect(null);
var ns:NetStream = new NetStream(nc);
ns.client = new CustomClient  ;
ns.play("video.flv");
var vid:Video = new Video  ;
vid.attachNetStream(ns);
addChild(vid);

 

 CustomClient 类如下所示:

 

package {
	public class CustomClient {
		public function onMetaData(infoObject:Object):void {
			trace("metadata");
		}
	}
}

 

 CustomClient 类为 

onMetaData
回调处理函数定义一个处理函数。如果遇到一个提示点并调用了 
onCuePoint
回调处理函数,则会调度一个 
asyncError
事件 (
AsyncErrorEvent.ASYNC_ERROR
),显示“flash.net.NetStream 无法调用回调 onCuePoint”。为了防止发生此错误,需要在 CustomClient 类中定义一个 
onCuePoint
回调方法,或者为 
asyncError
事件定义一个事件处理函数。


扩展 NetStream 类并添加处理回调方法的方法

以下代码创建 CustomNetStream 类的一个实例,CustomNetStream 类在后面的代码清单中定义:

 

var ns:CustomNetStream = new CustomNetStream  ;
ns.play("video.flv");
var vid:Video = new Video  ;
vid.attachNetStream(ns);
addChild(vid);
 

以下代码清单定义 CustomNetStream 类,该类扩展 NetStream 类、处理必要的 NetConnection 对象的创建并处理 
onMetaData
和 
onCuePoint
回调处理函数方法:

 

package {
	import flash.net.NetConnection;
	import flash.net.NetStream;
	public class CustomNetStream extends NetStream {
		private var nc:NetConnection;
		public function CustomNetStream() {
			nc = new NetConnection  ;
			nc.connect(null);
			super(nc);
		}
		public function onMetaData(infoObject:Object):void {
			trace("metadata");
		}
		public function onCuePoint(infoObject:Object):void {
			trace("cue point");
		}
	}
}

如果您想要重命名 CustomNetStream 类中的 

onMetaData()
和 
onCuePoint()
方法,可以使用以下代码:

 

package {
	import flash.net.NetConnection;
	import flash.net.NetStream;
	public class CustomNetStream extends NetStream {
		private var nc:NetConnection;
		public var onMetaData:Function;
		public var onCuePoint:Function;
		public function CustomNetStream() {
			onMetaData = metaDataHandler;
			onCuePoint = cuePointHandler;
			nc = new NetConnection  ;
			nc.connect(null);
			super(nc);
		}
		private function metaDataHandler(infoObject:Object):void {
			trace("metadata");
		}
		private function cuePointHandler(infoObject:Object):void {
			trace("cue point");
		}
	}
}

你可能感兴趣的:(Flash,as3,回调函数)