簡體   English   中英

Flex Spark VideoObject為null

[英]Flex Spark VideoObject is null

我正在使用Spark視頻組件,但是spark videoObject為null,當使用動態視頻源對象時,它仍為null。 可以正確檢測攝像機,但是使用變量時為null,直接使用Camera對象時,將檢測到usb攝像機,而videoobject仍然為null ...任何想法?

現在,當使用Camera.names時,所有“ cameras”都為空,當從apache虛擬主機播放視頻時,其播放效果很好,真是太不可思議了……!

根據要求,更新了代碼:

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"
                }
            }

這是正在運行的應用程序的屏幕截圖。

在此處輸入圖片說明

我看了一下VideoPlayer代碼,該類的許多屬性都有如下所示的setter:

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參數不是攝像機的實際名稱。 它應該是Camera.names數組中攝像機索引的String表示形式。 引用文檔:

name:String(default = null)—指定要獲取的攝像機,這是由names屬性返回的數組確定的。 對於大多數應用程序,請省略此參數以獲取默認相機。 要為此參數指定一個值,請使用Camera.names數組中從零開始的索引位置的字符串表示形式。 例如,要指定數組中的第三個攝像機,請使用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] );
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM