AS2 で Video オブジェクトを動的に作成し、それを MovieClip に追加するにはどうすればよいですか?
-
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() メソッドに相当するものも見当たりません。
実際にステージ上に表示される Video オブジェクトを AS2 で動的に作成する方法はありますか?
ただし、一度に複数のビデオが必要になる可能性があります。そのビデオオブジェクトを複製することは可能ですか?
別の解決策が機能すると思います。これは最適ではありませんが、他のコンポーネントに対して実行しなければならないことの一部と一致しているため、プロジェクト内でそれほど場違いではありません。理解できたら、私がやったことをここに投稿します。
解決
よし、何かうまくいったよ。
まず、新しいライブラリ シンボルを作成し、「VideoWrapper」という名前を付けました。次に、「video」という ID を持つ 1 つの Video オブジェクトをそれに追加しました。
これで、ビデオをステートに動的に追加する必要があるときはいつでも、MovieClip.attachMovie() を使用して Video オブジェクトの新しいコピーを追加できます。
作業を簡単にするために、基本的な UI 要素の処理 (setPosition()、setSize() など) を公開する VideoWrapper クラスを作成しました。したがって、通常の UI レイアウト コードでビデオを扱うときは、他のすべての UI 要素と同じように見えるように、これらのメソッドを使用するだけです。ビデオを扱うときは、クラスの「video」メンバーにアクセスするだけです。
実際の実装はもう少し複雑ですが、これが私が物事を機能させる方法の基本です。ローカル カメラから 1 つと FMS からストリーミングする 2 つのビデオを再生するテスト アプリがありますが、問題なく動作しています。
他のヒント
タグである行の終わりを送信するには、次の HTML シンボル エンティティを使用します。 w3スクール
プロジェクトから抜粋した例は次のようになります。
< 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;
//}
}
Video オブジェクトのインスタンスを 1 つ作成し、非表示のままにすることをお勧めします (つまり、 videoview.visible = false
)、必要なときにクリップをロードし、適切なタイミングで表示します。も使用できます swapDepth()
必要になった場合。
AS2 でのビデオ処理は、これまでで最高のものではありません。多くの小さな問題 (ギャップなしでループするなど) に遭遇することはありませんので、ご安心ください。
他のオプションは、UIcomponent mediaDisplay をライブラリに含めてから、attachMovie を使用してそのコンポーネントをアタッチすることなので、あなたのアプローチは私が通常行うことですが、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