메타데이터 및 큐 포인트에 대한 콜백 메서드 작성

Flash Player 9 이상, Adobe AIR 1.0 이상

플레이어에서 특정 메타데이터를 받거나 특정 큐 포인트에 도달할 때 응용 프로그램에서 액션을 트리거할 수 있습니다. 이러한 이벤트가 발생하면 특정 콜백 메서드를 이벤트 핸들러로 사용해야 합니다. NetStream 클래스는 재생 중에 발생할 수 있는 onCuePoint(FLV 파일만 해당), onImageData, onMetaData, onPlayStatus, onTextDataonXMPData 메타데이터 이벤트를 지정합니다.

이러한 핸들러에 대한 콜백 메서드를 작성해야 합니다. 그렇지 않으면 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 속성을 Object로 설정

client 속성을 Object 또는 NetStream 하위 클래스로 설정하여 onMetaDataonCuePoint 콜백 메서드를 다시 라우팅하거나 완전히 무시할 수 있습니다. 다음 예제에서는 asyncError 이벤트를 수신하지 않고 빈 Object를 사용하여 콜백 메서드를 무시하는 방법을 보여 줍니다.

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로 설정합니다.

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 콜백 핸들러가 호출되면 "flash.net.NetStream은(는) 콜백 onCuePoint을(를) 호출할 수 없습니다."라는 asyncError 이벤트(AsyncErrorEvent.ASYNC_ERROR)가 전달됩니다. 이러한 오류를 방지하려면 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 객체 생성을 처리하며 onMetaDataonCuePoint 콜백 핸들러 메서드를 처리하는 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 클래스를 확장하고 그 하위 클래스를 동적으로 만들어 onCuePointonMetaData 콜백 핸들러가 동적으로 추가될 수 있도록 할 수 있습니다. 다음 샘플에서는 이 방법을 설명합니다.

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); 
        } 
    } 
}

onMetaDataonCuePoint 콜백 핸들러에 대한 핸들러가 없어도 DynamicCustomNetStream 클래스가 동적이므로 오류가 발생하지 않습니다. onMetaDataonCuePoint 콜백 핸들러에 대한 메서드를 정의하려면 다음 코드를 사용합니다.

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"); 
}