メタデータとキューポイントのコールバックメソッドの作成

Flash Player 9 以降、Adobe AIR 1.0 以降

プレーヤーによって特定のメタデータが受信されたとき、または特定のキューポイントに到達したときに、アプリケーションでアクションをトリガーすることができます。これらのイベントが発生した場合は、特定のコールバックメソッドをイベントハンドラーとして使用する必要があります。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"); 
}