0

私はsparkビデオコンポーネントを使用していますが、spark videoObjectはnullであり、動的ビデオソースオブジェクトを使用する場合はnullのままです。カメラは正しく検出されていますが、変数を使用するとnullになり、Cameraオブジェクトを直接使用するとusbカメラが検出され、videoobjectはまだnullになります...アイデアはありますか?

Camera.namesを使用すると、すべての「カメラ」がnullになります。apachevirtualhostsからビデオを再生すると、うまく再生されます。これはとても奇妙です...!

要求に応じて、更新されたコード:

import mx.controls.Alert;
            import mx.events.FlexEvent;
            import spark.components.VideoPlayer;

            private var vidPlyr:VideoPlayer = null;

            protected function winAppCreated(event:FlexEvent):void {
                // Video Player
                vidPlyr = new VideoPlayer();
                vidPlyr.width = 320;
                vidPlyr.height = 240;

                // Video from apache virtualhost:
                vidPlyr.source = "http://flex.test.capimg/JormaKaukonenCracksInTheFinish.flv";
                addElement(vidPlyr);

                var cameraTV:Camera = Camera.getCamera(Camera.names[0]);
                var cameraUSB:Camera = Camera.getCamera(Camera.names[1]);

                if (cameraTV) {
                    vidPlyr.videoDisplay.videoObject.attachCamera(cameraTV);
                } else {
                    Alert.show("no TV card - " + Camera.names[0]);
                    // Alert shows: "no TV card - SAA7130 Analog TV Card" 
                }

                if (cameraUSB) {
                    vidPlyr.videoDisplay.videoObject.attachCamera(cameraUSB);
                } else {
                    Alert.show("no USB camera - " + Camera.names[1]);
                    // Alert shows: "no USB camera - USB2.0 Grabber"
                }
            }

これは実行中のアプリのスクリーンショットです。

ここに画像の説明を入力してください

4

1 に答える 1

0

コードを見てみると、VideoPlayerこのクラスのプロパティの多くには、次のようなセッターがあります。

public function set source(value:Object):void
{
    if (videoDisplay)
    {
        // do the real work
    }
    else
    {
        // store the value so we can use it later
     }
}

VideoDisplayビデオ プレーヤー クラスのスキン部分です。videoObjectソースを設定するとき、スキンがプロパティを初期化していてはなりません。ソースを設定してから、カメラを接続するまで待ちます。

Flex には、この問題を解決できるcallLater()方法があります。callLater()次の Flex 更新サイクルで指定した関数を実行します。

// after setting the source
callLater(attachCamera);


// define a new function 'attachCamera' to call later
private function attachCamera():void
{
    // if the videoObject property is not null
    if (vidPlyr.videoDisplay.videoOjbect != null)
    {
       // attach the camera here
    }
    else
    {
       trace("cannot attach the camera, videoObject is still null");
    }
}

[編集]

カメラを取得する API は奇妙です。署名は次のとおりです。

public static function getCamera(name:String = null):Camera

しかし、そのname引数はカメラの実際の名前ではありません。配列String内のカメラのインデックスの表現であるはずです。Camera.namesドキュメントの引用:

name:String (default = null) — names プロパティによって返される配列から決定される、取得するカメラを指定します。ほとんどのアプリケーションでは、このパラメーターを省略してデフォルトのカメラを取得します。このパラメーターの値を指定するには、Camera.names 配列内のゼロから始まるインデックス位置の文字列表現を使用します。たとえば、配列内の 3 番目のカメラを指定するには、Camera.getCamera("2") を使用します。

callLater(attachCamera)カメラを次のように取り付けるときは、次のようなより一般的なことを試してください。

private function attachCamera():void
{
    var cameras:Array = Camera.names;
    var length:int = cameras.length;
    var cameraObjects:Array = [];
    for (var i:int = 0; i < length; i++)
    {
        cameraObjects.push( Camera.getCamera( i.toString() );
    }

    // use your own logic to select a camera, if there's more than one
    if (cameraObjects.length > 0 && vidPlyr.videoDisplay.videoOjbect != null)
    {
        vidPlyr.videoDisplay.videoOjbect.attachCamera( cameraObjects[0] );
    }
}
于 2012-07-10T16:45:08.790 に答える