プレーヤーによって特定のメタデータが受信されたとき、または特定のキューポイントに到達したときに、アプリケーションでアクションをトリガーすることができます。これらのイベントが発生した場合は、特定のコールバックメソッドをイベントハンドラーとして使用する必要があります。NetStream クラスでは、再生中に発生する可能性のある
onCuePoint
(FLV ファイルのみ)、
onImageData
、
onMetaData
、
onPlayStatus
、
onTextData
および
onXMPData
のメタデータイベントを指定します。
これらのハンドラーのコールバックメソッドも記述しておく必要があります。コールバックメソッドがなければ、Flash ランタイムがエラーをスローします。例えば、次のコードは、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 という名前のローカルビデオファイルをロードし、送出される
asyncError
(
AsyncErrorEvent.ASYNC_ERROR
)を監視します。このイベントは、ネイティブ非同期コードから例外がスローされると送出されます。 この場合、ビデオファイルにメタデータまたはキューポイント情報が含まれ、適切なリスナーが定義されていない場合に送出されます。前述のコードでは、ユーザーがビデオファイルのメタデータまたはキューポイント情報に関心がなければ、
asyncError
イベントを処理し、エラーを無視します。メタデータと複数のキューポイントがある FLV がある場合は、
trace()
関数によって、次のエラーメッセージが表示されます。
Error #2095: flash.net.NetStream was unable to invoke callback onMetaData.
Error #2095: flash.net.NetStream was unable to invoke callback onCuePoint.
Error #2095: flash.net.NetStream was unable to invoke callback onCuePoint.
Error #2095: flash.net.NetStream was unable to invoke callback onCuePoint.
エラーが発生する理由は、NetStream オブジェクトが
onMetaData
または
onCuePoint
コールバックメソッドを見つけられなかったからです。アプリケーション内でこれらのコールバックメソッドを定義するには、いくつかの方法があります。
NetStream オブジェクトの client プロパティをオブジェクトに設定
client
プロパティをオブジェクトまたは NetStream のサブクラスに設定すると、
onMetaData
および
onCuePoint
コールバックメソッドをリルートするか、完全に無視することができます。次の例は、空のオブジェクトを使用し、
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 ランタイムがキューポイントに到達した場合、
onCuePoint
コールバックメソッドが定義されていなくても、エラーは発生しません。
カスタムクラスの作成とコールバックメソッドを処理するメソッドの定義
次のコードは NetStream オブジェクトの
client
プロパティを、カスタムクラスである CustomClient に設定します。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 was unable to invoke callback onCuePoint」(flash.net.NetStream は onCuePoint コールバックを開始できませんでした)と示されます。このエラーを回避するには、CustomClient クラスで
onCuePoint
コールバックメソッドを定義するか、
asyncError
イベントのイベントハンドラーを定義する必要があります。
NetStream クラスの拡張とコールバックメソッドを処理するメソッドの追加
次のコードでは、後述するコードで定義されている CustomNetStream クラスのインスタンスを作成します。
var ns:CustomNetStream = new CustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
次のコードは、NetStream クラスを拡張し、必要な NetConnection オブジェクトを作成し、
onMetaData
および
onCuePoint
コールバックハンドラーメソッドを処理する CustomNetStream クラスを定義します。
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");
}
}
}
NetStream クラスの拡張と動的化
NetStream クラスを拡張し、サブクラスを動的にすると、
onCuePoint
および
onMetaData
コールバックハンドラーを動的に追加することができます。例を次のコードに示します。
var ns:DynamicCustomNetStream = new DynamicCustomNetStream();
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
DynamicCustomNetStream クラスを次に示します。
package
{
import flash.net.NetConnection;
import flash.net.NetStream;
public dynamic class DynamicCustomNetStream extends NetStream
{
private var nc:NetConnection;
public function DynamicCustomNetStream()
{
nc = new NetConnection();
nc.connect(null);
super(nc);
}
}
}
onMetaData
および
onCuePoint
コールバックハンドラーのハンドラーがない場合でも、DynamicCustomNetStream クラスは動的なのでエラーはスローされません。
onMetaData
および
onCuePoint
コールバックハンドラーのメソッドを定義するには、次のコードを使用します。
var ns:DynamicCustomNetStream = new DynamicCustomNetStream();
ns.onMetaData = metaDataHandler;
ns.onCuePoint = cuePointHandler;
ns.play("http://www.helpexamples.com/flash/video/cuepoints.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
function metaDataHandler(infoObject:Object):void
{
trace("metadata");
}
function cuePointHandler(infoObject:Object):void
{
trace("cue point");
}
NetStream オブジェクトの client プロパティを this に設定
client
プロパティを
this
に設定すると、アプリケーションは
onMetaData()
および
onCuePoint()
メソッドの現在の範囲を探します。これを次の例に示します。
var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
ns.client = this;
ns.play("video.flv");
var vid:Video = new Video();
vid.attachNetStream(ns);
addChild(vid);
onMetaData
または
onCuePoint
コールバックハンドラーが呼び出され、コールバックを処理するメソッドがない場合、エラーは発生しません。これらのコールバックハンドラーを処理するには、次のコード例に示すように、コードに
onMetaData()
および
onCuePoint()
メソッドを作成します。
function onMetaData(infoObject:Object):void
{
trace("metadata");
}
function onCuePoint(infoObject:Object):void
{
trace("cue point");
}