0

我正在使用火花视频组件,但是火花视频对象为空,当使用动态视频源对象时它仍然为空。相机被正确检测,但是当使用变量时它为空,当直接使用相机对象时检测到usb相机并且videoobject仍然为空......有什么想法吗???

现在,当使用 Camera.names 时,所有“相机”都为空,当从 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"
                }
            }

这是正在运行的应用程序的屏幕截图。

在此处输入图像描述

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 数组中从零开始的索引位置的字符串表示形式。例如,要指定数组中的第三个摄像头,请使用 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 回答