본문 바로가기

플래시 외부 동영상 파일 재생하기

반응형

플래시에서 외부 이미지나 swf를 로드하고 x, y좌표를 변경하는 방법에는

3가지가 있습니다.

다음 메서드들은 ActionScript 2.0방식입니다. 3.0에서는 완전히 다릅니다.

 

MovieClip.loadMovie(usr:String, depth:Number);

MovieClip.laodMovieNum(usr:String, level:Number);

 

위 두 메서드의 차이점은 loadMovie는 함수를 호출한 무비클립 객체가 디스플레이가

됩니다. 무비클립을 타임라인 스테이지에 만들고  인스턴스를 aClip이라고 지정한 상태에서

aClip.loadMovie("some.swf", 1) 하게되면 aClip의 형태나 모양은 사라지고 some.swf가

aClip이 있던 위치를 기준으로 로드가 됩니다.

로드된 some.swf를 제거하려면 unloadMovie(aClip) 를 사용합니다. aClip은 로드하는데

사용한 클립을  파라미터로 전달하는 것입니다.

 

loadMovieNum은 새로운 레벨을 생성하여 로드합니다.  _level은 타임라인의 Layer와

비슷한 구조를 가지고 있습니다. 기본인 _level은 _level0으로 표현할수 있으며 파라미터에

전달한 숫자는 클수록 상단 레이어에 올려집니다.

loadMovieNum("some.swf", 1)로 어떤 무비를 로드하게되면 해당 무비는 _level1에

속하게 되며 loadMovieNum("some.swf", 2)는 _level2에 속하게 됩니다.

로드된 무비를 제거하려면 unloadMovieNum(1); 과 같이 로드된 레벨을 파라미터로 사용합니다.

 

위의 두 메서드는 로드되는 영역만 다를뿐 거의 비슷합니다.

 

먼저 위에서 설명한 loadMovie와 loadMovieNum의 문제점은 로드가 완료된 시점을

알리는 이벤트가 없습니다.  다른 로드 방법인 MovieClipLoader 클래스는 이러한 문제점을 해결하였지만 지금 질문자께서 이해하기에는 조금 어려울겁니다.

 

질문하신 코드는 잘못된 코딩이므로 올바른 코드로 수정하여 예제들을 보여드리죠.

 

//먼저 로더로 이용될 빈 무비클립을 생성합니다.

_root.createEmptyMovieClip("loaderClip", this.getNextHighestDepth());

//생성한 빈 무비클립에 loadMovie메서드를 사용하여 trailer.swf를 1뎁스에 로드합니다.

loaderClip.loadMovie("trailer.swf", 1)

//그리고 다음과 같이 _x속성과 _y속성을 사용하여 변경합니다.

loaderClip._x = 51.5;

loaderClip._y= 198.7;

 

로드는 위와같이 하면 됩니다. 그리고 언로드하려면 다음과 같이 하면 됩니다.

다음 코드를 삭제버튼 이벤트 펑션에 작성하세요.

 

loaderClip.unloadMovie(this);

//위코드로 언로드가 되었고 loaderClip도 더이상 필요없다면 다음과 같이 지워버립니다.

_loaderClip.removeMovieClip();

 

 

여기서는 부터는 추가로 알려드리는 것입니다.

위와 같이 코딩을 변경하시면 일단은 잘될것입니다.

그러나 trailer.swf안에 있는 무비클립 객체의 위치나 사이즈를 변경하는데는

문제가 발생합니다. loaderClip의 좌표는 이미 메인swf가 로드된 상태이므로

바로 접근이 가능하지만 trailer.swf안의 클립들은 로드가 완료된 시점에서만

접근 가능하므로 onload된 후에서만 접근가능해집니다. 만약 tailer.swf안에

someClip이라는 인스턴스의 무비클립에 접근하여 x,y좌표를 변경하려고 다음과

같이 코딩하면 전혀 작동하지 않을것입니다.

 

//먼저 로더로 이용될 빈 무비클립을 생성합니다.

_root.createEmptyMovieClip("loaderClip", this.getNextHighestDepth());

//생성한 빈 무비클립에 loadMovie메서드를 사용하여 trailer.swf를 1뎁스에 로드합니다.

loaderClip.loadMovie("trailer.swf", 1)

//그리고 다음과 같이 _x속성과 _y속성을 사용하여 변경합니다.

loaderClip._x = 51.5;

loaderClip._y= 198.7;

 

//추가로 trailer.swf안의 someClip의 x, y속성을 변경하려고 다음과 같이 코딩하면

//전혀 작동하지 않게 됩니다.

 

loaderClip.someClip._x = 100;  //위치 변경되지 않음

loaderClip.someClip._y = 200;

 

loaderClip에 로드된 trailer.swf안의 someClip에 접근하고 x, y위치를 변경하려 했지만

아무런 작동도 하지 않는 것은 위 코드는 trailer.swf가 로드되기도 전에 이미 실행을

마쳤기 때문에 그렇습니다.  위에서도 설명 드렸지만 loadMovie메서드는 로딩이

완료되는 시점을 알리는 이벤트가 없습니다. 로드가 완료되는 시점을 체크

하려면 다음과 같은 방법을 사용해야 합니다.

 

//로딩을 체크를 수행할 엔터프래임이벤트를 등록하는 빈 무비클립을 생성

_root.createEmptyMovieClip("loaderCheckClip", this.getNextHighestDepth());

//로딩체크 엔터프래임 이벤트 등록

loaderCheckClip.onEnterFrame = function()
{

  //loaderClip 객체에 로딩되는 토탈 바이트와  로드바이트를 체크하여 같아지면 
   if(loaderClip.getBytesLoaded() == loaderClip.getBytesTotal())
   {

        //내부의 클립 속성을 변경하고
        loaderClip.someClip._x = 100;
        loaderClip.someClip_y = 100;
       trace("trailer.swf loaderClip에 로드하고 trailer.swf안에 있는 someClip의 위치를 변경함");

      //로드체크 이벤트를 제거하고

      this.onEnterFrame = null;

      //로드에 사용된 빈 무비클립을 제거함

      this.removeMovieClip();
    }
}

 

참고로 로드에 사용된 이벤트나 필요없어진 객체를 제거하는 것은 매우 중요합니다.

잘못 만들어진 플래시 무비들은 쓸데없이 무겁고 느린것이 필요없는 이벤트나

필요없는 객체들을 생성하고 지우지 않기 때문입니다.

 

그럼 수고하세요.

 

 

 

플래시는 wmv파일을 직접 로드하지 못합니다.

wmv를 flv로 변환하여 NetStream객체와 NetConnection객체를 생성하여

로드해야만 합니다.

 

다음은 간단한 flv동영상을 재생하는 방법입니다.

 

먼저 동영상을 flv로 인코딩합니다. flv는 Sorenson Squeeze 로 인코딩 하면

flash에서 기본 인코더 보다 다양한 옵션과 화질 설정이 가능합니다.

 

라이브러리에서 오른쪽 버튼을 눌러 new Video를 선택하여 라이브러리에 추가된

video객체를 스테이지에 끌어다 놓고 myVideo라느 인스턴스를 지정합니다.

그리고 타임라인에 다음과 같이 코딩합니다.

 

var flvURL = "movie.flv";    //flv 경로주소

 

 //flv동영상을 로드하기 위한 넷컨넥션 오브젝트들의 생성 및 초기화
var netconObj:NetConnection = new NetConnection();

netconObj.connect(null);
var streamObj.NetStream = new NetStream(netconObj);
myVideo.attachVide(streamObj);

 

//flv를 로드하고 재생함

streamObj.play(flvURL);   

 

동영상을 컨트롤하고 제어하는 것은 NetStream 클래스의 속성과 메서드를 살펴보세요.

 

level은 플래시의 메인타임라인 스테이지 가르킵니다. _root와 _level은 동일한

의미를 가집니다.

반응형