2009-11-03 4 views
1

여러 개의 동영상을 MovieClip 객체로 저장하고이를 하나의 MovieClip 비디오 객체로 병합하여 모든 내용을 순서대로 재생하므로 사용자가 단일 비디오라고 생각할 수 있습니다.).여러 개의 MovieClip을 하나의 MovieClip으로 병합

고마워요!

편집 : Flash Player 내부의 ActionScript에서 프로그래밍 방식으로 수행하고 싶습니다.

답변

-1

타임 라인에 차례로 추가하십시오. 포함 된 영화의 재생 시간만큼 타임 라인에 각 영화 클립이 있는지 확인하십시오. 동영상 클립이 포함될 타임 라인에 키 프레임을 추가하여이 작업을 수행 할 수 있습니다. 또한 비디오 프레임 속도와 플래시 플레이어 프레임 속도가 동일한 지 확인하십시오.

이것은 프로그래밍 문제가 아닙니다.

+0

저는 Flash Player 내부의 ActionScript에서이 작업을 수행해야한다고 명확히 했으므로 프로그래밍 문제입니다. – bartekb

1

TIMELINE_COMPLETE 이벤트가 있다면 좋을 것입니다. 그러나 거기에 없다! 따라서 가장 좋은 방법은 문서화되지 않은 addFrameScript 메소드입니다.

addFrameScript()를 사용하여 MovieClips (또는 다른 프레임)의 마지막 프레임에 코드를 추가 할 수 있습니다. 이 코드는 이전 MovieClip (방금 완료 한 MovieClip)을 제거하고 새 MovieClip (다음 MovieClip을 대기열에 추가)을 추가 할 수 있습니다.

public function Main() 
{ 
    // Remember addFrameScript() is zero based. 
    currentVidMc.addFrameScript(currentVidMc.totalFrames - 1, frameFunction); 
} 

private function frameFunction():void 
{ 
    //delete frame script by passing null as second parameter 
    currentVidMc.addFrameScript(currentVidMc.totalFrames - 1, null); 

    removeChild(currentVidMc); 
    addChild(newVidMc); 
    newVidMc.gotoAndPlay(1); 
} 

EDIT *

원활한 전환을하려면, 당신은 볼 세트 (약 15 프레임이 나에게 좋은 소리지만, 당신이 시도해야합니다) 초기에 새 클립의 로딩을 시도 할 수 거짓, 중지됨. 그런 다음 현재 클립의 마지막 프레임이 굴러 올 때 현재 클립을 제거하고 새 클립 visible 속성을 true로 설정하고 재생하십시오. 점프의 대부분은 클립을 스테이지에로드 할 때 발생하므로 클립을 미리 렌더링하면 도움이 될 수 있습니다.

+0

감사합니다. 불행히도, 이것은 내 문제를 해결하지 못합니다. MovieClip의 ENTER_FRAME 이벤트를 사용하여 비슷한 작업을 수행했습니다. ENTER_FRAME 이벤트가 발생하면 currentFrame과 totalFrames를 비교하여 같으면 후속 MovieClip을 재생하기 시작합니다. 그러나 MovieClips의 스티칭 지점에서 눈에 띄는 지연이 있습니다. MovieClips를 단일 프레임으로 결합 할 수 있다면 지연을 없앨 수 있다고 생각했습니다. 가능한가? – bartekb

+0

당신은 확실히 맞습니다. 이는 일반적인 문제입니다. 도움이 될만한 답변을 편집했습니다. –

+0

감사합니다. 모든 것을 미리로드하려고 시도했지만, MovieClips를 전환 할 때 play() 또는 gotoAndPlay()를 호출해도 꽤 빠른 시스템에서도 지연이 눈에 띄게 나타납니다. 주위에 길은없는 것처럼 보입니다. – bartekb

0

답변이 아니라 실제로 시도해 볼 수있는 2 가지 사항입니다.

package { 
    import flash.display.MovieClip; 
    import flash.events.Event; 

    public class OneMovieToRuleThemAll extends MovieClip { 

     public subClips:Array; //vector for cs4 
     private var index:int = 0; 

     public function OneMovieToRuleThemAll(subClips:Array) { 
      this.subClips = subClips; 
     } 

     //pre subClips.length > 0 
     public function playAll() { 
      for(var i:int = 0; i < subClips.length; i++) { 
       subClips[i].visible = i == 0; 
       subClips[i].stop(); 
       addChild(subClips[i]); 
      } 
      addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     } 

     private function onEnterFrame(e:Event) { 
      if(index >= subClips.length) { 
       //dispatchEvent finished 
       removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
      } 

      if(subClips[index].currentFrame < subClips[index].totalFrames) { 
       subClips[index].gotoAndStop(subClips[index].currentFrame + 1); 
      }else{ 
       subClips[index].visible = false; 
       index++; 
       subClips[index].visible = true; 
      } 

     } 
    } 

} 

일반적으로 사용하는 낙담 것 ENTER_FRAME 및 gotoAndStop로 (currentFrame)는 느린,하지만 당신은 늘 어떤 '봉합'

대안도 만들 수를 알 수 있도록 어쩌면이 각 프레임에 대한 동등하게 느리기 때문에 BitmapData.draw (..)를 사용하여 각 동영상의 각 프레임에 대한 비트 맵이있는 새로운 무비 클립입니다. 그런 다음 동일한 enter_frame 루프를 사용하고 각 프레임에 대해 표시되는 속성을 토글합니다. 아마도 메모리 할당량을 사용하고 있으며 원격으로 실행 가능한 속도인지 알 수 없습니다.

0

* 일부 XML 구성에서 표시 할 파일의 순서를 알 수 있습니다. * 첫 번째 파일 측정 fps (또는 사용 가능한 RAM 또는 인터넷 연결 - vedia를 재생하는 PC에 파일을 전달하는 방법에 따라 다름) * 마지막으로 랩퍼는 두 번째 파일을 재생 가능한 비율로로드하는 예상 시간의 200 % -300 %라고 결정합니다. * 예지 알고리즘이 충분히 좋은 경우 - 첫 번째 중지 전에 두 번째 vid가 있습니다. 그래서 가장 쉬운 부분은 여기에 있습니다. 마지막 프레임과 첫 번째 프레임이 충분히 일치하는 경우입니다. 필요한 프레임에서 두 번째 비디오를 일시 정지하고 알파를 0으로 설정하면 첫 번째 프레임 아래에 배치됩니다. 첫 번째 프레임이 일치하면 알파를 줄이기 시작하여 두 번째 프레임을 증가시키고 대신 일시 중지에서 해제합니다.

오직 인간의 작업 (래퍼 코딩을 제외하고 최대 몇 개의 코드 화면처럼 느껴짐)은 일치하는 프레임을 검색하여 config에 모두 넣는 것이지만 BitmapData.compare()을 사용하여 피할 수 있습니다 방법. 행운을 빕니다!

관련 문제