코드/ActionScript & MXML

NetStream 클래스에서 NetStatusEvent, onMetaData

Yeah-Panda 2011. 2. 16. 17:51
가령

private var nst:NetStream;
private var vdo:Video;
private var totalTime:Number;

private function init():void
{
    var conn:NetConnection = new NetConnection;
    conn.connect(null);

    nst = new NetStream(conn);
    nst.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler);

    var nsClient:Object = new Object;
    nsClient.onMetaData = _clientMetaData;
    nst.client = nsClient;

     vdo = new Video;
    vdo.attachNetStream(nst);
    addChild(vdo);
    vdo.visible = false;

    nst.play(url);
}


private function _statusHandler($ev:NetStatusEvent):void
{
    trace("Status Time = "+getTimer());

    if(vdo.videoWidth !=0 && totalTime>0)
    { 
        trace("Video is Activated!!");

        vdo.width = vdo.videoWdith;
        vdo.height = vdo.videoHeight;
        vdo.visible = true;
    }
}

private function _clientMetaData($ev:Object):void
{
    trace("TotalTime = "+getTimer());
    totalTime = $ev.duration;

   
}

//output
Status Time = 76;
TotalTime = 409

_clientMetaData 핸들러가 트리거 되는 시간이 _statusHandler 를 트리거 하는 시간보다 늦습니다.
원래 NetStatusEvent 는 한번만 부르는게 아니고 여러번에 걸쳐 호출하기때문에 이럴 일은 적지만
만약 if(vdo.videoWidth != 0 && totalTime >0) 조건문안에 실행함수를 둘경우 여러번 실행되는 상황이 되어
isFirstStream 변수를 두어(if(firstStream && vdo.videoWidth !=0 && totalTime>0) ) 처음 한번만 실행되도록 했더니 video 가 안보이는 현상이 발생함. 이럴 경우 isFirstStream 변수를 따로 조건 문으로 걸어서 그안에 함수 실행하도록 한다.

if(vdo.videoWidth != 0 && totalTime >0)
{
    vdo.width=vdo.videoWidth, vdo.height = vdo.videoHeight;
    vdo.visible = true;
    if(isFirstStream)
    {
        playPlayer();
        isFirstStream=false;
    }
}


만약

(if(firstStream && vdo.videoWidth !=0 && totalTime>0) )

비디오를 자동 플레이 시키지 않고 썸네일버튼 같은 것을 올려놓아 수동으로 플레이 하게 될경우
비디오 넓이와 visible 가 활성화 되지 않는 상황이 발생합니다.


// 추가
지금 확인하니 isFirstStream 변수를 따로 조건문을 걸어 거기에 함수를 놓아도 되지 않는다.
결국 onMetaData 에서 duration 을 값을 얻었을때 함수를 실행시키거나
vdo.VideoWidth 나 totalTime 과 관련없이 그냥 isFirstStream 조건만 걸어서 비디오를 활성화 시켜야 할듯하다.


//현재 해결 상황

switch($ev.info.code)
{
     case "NetStream.Play.Start":
     break;
    
    case "NetStream.Buffer.Full":

        _vdo.width = _vdo.videoWidth;
        _vdo.height = _vdo.videoHeight;

        if (_isFirstStream)
        {
            _screenHolder.addChild(_vdo);
            setController();
            _isFirstStream = false;
        }
        break;
}

'코드 > ActionScript & MXML' 카테고리의 다른 글

Object["String"]  (0) 2011.05.06
스케일폼 4.0에서 AS3.0 지원  (0) 2011.04.02
렌더링 문답.  (0) 2010.10.31
FITC 2010 gskinner Quick Flash 플래시 컨텐츠 최적화  (0) 2010.10.02
AS3.0 리스너 자동 제거하기.  (0) 2010.10.02