메타데이터 및 큐 포인트에 대한 콜백 메서드 작성
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 속성을 Object로 설정
client 속성을 Object 또는 NetStream 하위 클래스로 설정하여 onMetaData 및 onCuePoint 콜백 메서드를 다시 라우팅하거나 완전히 무시할 수 있습니다. 다음 예제에서는 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 객체 생성을 처리하며 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");
}