AS2에서 Video 개체를 동적으로 생성하여 MovieClip에 추가하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/52732

  •  09-06-2019
  •  | 
  •  

문제

ActionScript 2에서 Video 객체를 동적으로 생성하여 무비 클립에 추가해야 합니다.AS3에서는 다음과 같이 합니다.

var videoViewComp:UIComponent; // created elsewhere    

videoView = new Video();
videoView.width = 400;
videoView.height = 400;
this.videoViewComp.addChild(videoView);

불행히도 AS2에서 이 작업을 수행하는 방법을 알 수 없습니다.Video는 MovieClip의 자식이 아니므로,attachMovie()는 나에게 아무 것도 얻지 못하는 것 같습니다.AS3의 UIComponent.addChild() 메소드와 동등한 것도 보이지 않습니다.

실제로 스테이지에 표시되는 AS2의 비디오 개체를 동적으로 생성할 수 있는 방법이 있습니까?


하지만 한 번에 여러 개의 비디오가 필요할 수 있습니다.해당 비디오 개체를 복제할 수 있습니까?

다른 솔루션이 작동하고 있다고 생각합니다.최적은 아니지만 다른 구성 요소에 대해 수행해야 하는 작업 중 일부에 적합하므로 프로젝트에서 너무 어긋나지는 않습니다.일단 내가 한 일을 여기에 게시하겠습니다.

도움이 되었습니까?

해결책

좋아, 뭔가 일이 있어.

먼저 새 라이브러리 심볼을 만들고 이름을 "VideoWrapper"로 지정했습니다.그런 다음 ID가 "video"인 단일 Video 개체를 추가했습니다.

이제 상태에 비디오를 동적으로 추가해야 할 때마다 MovieClip.attachMovie()를 사용하여 Video 객체의 새 복사본을 추가할 수 있습니다.

작업을 더 쉽게 하기 위해 기본 UI 요소 처리(setPosition(), setSize() 등)를 노출하는 VideoWrapper 클래스를 작성했습니다.따라서 일반 UI 레이아웃 코드에서 비디오를 처리할 때 해당 메서드를 사용하면 다른 모든 UI 요소와 똑같이 보입니다.비디오를 다룰 때 나는 클래스의 "video" 멤버에만 액세스합니다.

실제 구현은 좀 더 복잡하지만 이것이 작업을 수행하는 방법의 기본입니다.로컬 카메라에서 하나, FMS에서 스트리밍하는 하나, 총 2개의 비디오를 재생하는 테스트 앱이 있는데 잘 작동합니다.

다른 팁

태그인 줄의 끝을 보내기 위해 HTML 기호 엔터티를 사용합니다. w3schools

프로젝트에서 가져온 예는 다음과 같습니다.

< asset path="library\video.swf" />

위의 줄은 파일을 포함하는 library라는 디렉토리가 있음을 보여줍니다. video.swf

게다가 디렉토리 라이브러리에 video.xml 파일이 있습니다.해당 파일에는 다음 줄이 포함되어 있습니다.

<xml version="1.0" encoding="utf-8" >
<movie version="7">    
    <frame>
        <library>
            <clip id="VideoDisplay">
                <frame>
                    <video id="VideoSurface" width="160" height="120" />
                    <place id="VideoSurface" name="video" />
                </frame>
            </clip>
        </library>
    </frame>
</movie>

오래 전에 내 아들 Alex는 인터넷에서 VideoDisplay 클래스 코드와 디렉토리 라이브러리를 다운로드했습니다.

VideoDisplay 클래스의 코드를 개선했습니다.

멤버 2명을 써서

 public function pos():Number
{
    return ns.time;
}

     public function close():Void
{
    return ns.close();
}

내가 만든 프로그램은 탐험가이자 발표자 이상입니다. .flv 파일

또한 각각의 선택된 조각의 탐험가이자 발표자입니다. .flv 파일

이제 VideoDisplay 클래스의 코드는 다음과 같습니다.

class util.VideoDisplay
{
    //{ PUBLIC MEMBERS


    /**
    * Create a new video display surface
    */

    function VideoDisplay(targetURI:String, parent:MovieClip, name:String, depth:Number, initObj)

    {
        display = parent.attachMovie("VideoDisplay", name, depth, initObj);

        // create video stream
        nc = new NetConnection();
        nc.connect(targetURI);
        ns = new NetStream(nc);

        // attach the video stream to the video object
        display.video.attachVideo(ns);
    }

    /**
    * Video surface dimensions
    */
    function setSize(width:Number, heigth:Number):Void
    {
        display.video._width = width;
        display.video._height = heigth;
    }
    /**
    * Video clip position
    */
    function setLocation(x:Number, y:Number):Void
    {
        display._x = x;
        display._y = y;
    }

    /**
    * Start streaming
    * @param    url FLV file
    * @param    bufferTime  Buffer size (optional) 
    */
    public function play(url:String, bufferTime:Number):Void
    {
        if (bufferTime != undefined) ns.setBufferTime(bufferTime);
        ns.play(url);
    }
    /**
    * Pause streaming
    */
    public function pause():Void
    {
        ns.pause();
    }
    /**
    * Seek position in video
    */
    public function seek(offset:Number):Void
    {
        ns.seek(offset);
    }   

    /**
    * Get position in video
    */

     public function pos():Number
    {
        return ns.time;
    }

         public function close():Void
    {
        return ns.close();
    }

    //}

    //{ PRIVATE MEMBERS 

    private var display:MovieClip;
    private var nc:NetConnection;
    private var ns:NetStream;

    //}
}

비디오 개체의 단일 인스턴스를 만들고 보이지 않게 두는 것이 좋습니다(예: videoview.visible = false), 필요할 때 클립을 로드하여 적절한 시간에 표시합니다.당신은 또한 사용할 수 있습니다 swapDepth() 필요한 경우.

AS2의 비디오 처리는 역대 최고가 아닙니다.많은 작은 문제(간격 없는 반복 등)에 직면하게 될 것이므로 안심하십시오.

귀하의 접근 방식은 제가 일반적으로 수행하는 방식입니다. 다른 옵션은 UI 구성 요소 mediaDisplay를 라이브러리에 포함시킨 다음 attachmentMovie를 사용하여 해당 구성 요소를 연결하는 것이지만 mediaDisplay에 약간의 버그가 있어서 기본 비디오 인스턴스를 사용하는 것을 선호하기 때문입니다.

아래 코드가 여러분에게 매우 유용하길 바랍니다.

import UTIL.MEDIA.MEDIAInstances

class Main

{
    static function main() {

        var MEDIAInstancesInstance :MEDIAInstances  = new MEDIAInstances (); 

        _root.Video_Display.play ("IsothermalCompression.flv", 0);

        _root.VideoDisplayMC.onPress = function() { 

        _root.Video_Display.seek (0);        

        } // _root.displayMC.onPress = function() {

    } // static function main() 

} // class Main 

// 

import UTIL.MEDIA.VideoDisplay  

class UTIL.MEDIA.MEDIAInstances             

    {  

    function MEDIAInstances() 

    {

    //                                            depth  
    _root.createEmptyMovieClip ("VideoDisplayMC", 500);   
    //
    var Video_Display:VideoDisplay 
    = 
    new VideoDisplay(_root.VideoDisplayMC, "Video_Display", 1); 

    Video_Display.setLocation(400, 0); Video_Display.setSize (320, 240);      
    //    
    _root.Video_Display = Video_Display;  _root.VideoDisplayMC._alpha = 75;      

    } // MEDIAInstances()

} // class UTIL.MEDIA.MEDIAInstances

//

class UTIL.MEDIA.VideoDisplay

{
    private var display:MovieClip, nc:NetConnection, ns:NetStream;

    function VideoDisplay(parent:MovieClip, name:String, depth:Number)

    {
        display = parent.attachMovie("VideoDisplay", name, depth);

        nc = new NetConnection(); nc.connect(null); ns = new NetStream(nc);

        display.video.attachVideo(ns);
    }
    function setSize(width:Number, heigth:Number):Void

    { display.video._width = width; display.video._height = heigth;}

    function setLocation(x:Number, y:Number):Void { display._x = x; display._y = y;}

    public function play(url:String, bufferTime:Number):Void
    {
        if (bufferTime != undefined) ns.setBufferTime(bufferTime); ns.play(url);
    }
    //
    public function pause():Void { ns.pause();}
    //
    public function seek(offset:Number):Void { ns.seek(offset); }

} // UTIL.MEDIA.VideoDisplay
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top