Flash 如何使用Camera类控制视觉效果?

Flash 如何使用Camera类控制视觉效果?,flash,actionscript,camera,Flash,Actionscript,Camera,我已经检查了文件: 但是仍然没有找到关于如何控制我的pc相机的视觉效果(如亮度、饱和度等)的信息 actionscript可以做这种工作吗?你不能改变实际的相机数据(这与我进一步描述的有区别),但可以轻松地做你想做的事情,将摄像头对象附加到视频对象,并使用其他原生ActionScript类(如ColorTransform,DisplayObject.transform.ColorTransform和DisplayObject.filters)中的各种转换过滤器和例程,来改变屏幕/内存上显示的内

我已经检查了文件:

但是仍然没有找到关于如何控制我的pc相机的视觉效果(如亮度、饱和度等)的信息


actionscript可以做这种工作吗?

你不能改变实际的相机数据(这与我进一步描述的有区别),但可以轻松地做你想做的事情,将摄像头对象附加到视频对象,并使用其他原生ActionScript类(如
ColorTransform
DisplayObject.transform.ColorTransform
DisplayObject.filters
)中的各种转换过滤器和例程,来改变屏幕/内存上显示的内容,我相信,这可能是你想要的

要提供真实世界的使用示例,可以使用以下代码调整视频中显示的相机数据的饱和度:

/// Desaturate displayed image completely
video.filters = [ new ColorMatrixFilter(saturation_filter_matrix(0)) ];
其中,我将方法定义为:

static inline var RWGT = 0.3086;
static inline var GWGT = 0.6094;
static inline var BWGT = 0.0820;

static public function brightness_filter_matrix(b: Float)
{
    return [    b, 0, 0, 0, 0,
                0, b, 0, 0, 0,
                0, 0, b, 0, 0,
                0, 0, 0, 1, 0 ];
}

static public function saturation_filter_matrix(s: Float)
{
    var b = (1 - s) * RWGT;
    var a = b + s;
    var d = (1 - s) * GWGT;
    var e = d + s;
    var g = (1 - s) * BWGT;
    var i = g + s;

    return [    a, d, g, 0, 0,
                b, e, g, 0, 0,
                b, d, i, 0, 0,
                0, 0, 0, 1, 0 ];
}

static public function contrast_filter_matrix(v: Float)
{
    v += 1;

    var r = v;
    var g = v;
    var b = v;

    return [    r, 0, 0, 0, 128 * (1 - r),
                0, g, 0, 0, 128 * (1 - g),
                0, 0, b, 0, 128 * (1 - b),
                0, 0, 0, 1, 0 ];
}
我还认为,
transform.colorTransform
做同样的工作可能更有效,不知何故,我观察到过滤器往往会对AdobeFlashPlayer产生中度到高度的负担,因此请注意

无法更改实际摄像机输入这一事实的含义是,当您通过网络发布摄像机时(例如,到Flash Media Server),无论您使用何种效果在自己的视频对象中显示数据,播放流的一方都将看到原始的未经更改的数据。“解决方法”是向接收方宣布您希望他们应用于播放流的视频对象的确切参数。假设它们应用这些参数的方式与您对显示的相机图像的应用方式相同,它们将以您的方式查看相机图像


注意:代码是用Haxe编写的,但这两种语言非常相似。您需要注意的变化是(Haxe的明显广告如下:-)
Float
在Haxe中是
Number
在ActionScript 3中,例如,Haxe使用类型推断,这使得可以随意省略变量类型,让Haxe自己解决它(当你添加两个
int
时,你会得到什么?在Flash平台上,你总是会得到一个
int
)同样,AS3也没有内联的概念(还没有?)因此,您必须简单地从代码中删除
内联
语法,仅此而已。

对于您关于直接访问相机数据的评论,我能想到的唯一问题是,如果您正在向FMS(闪存媒体服务器、Red5、wowza等)进行录制,在这种情况下,数据直接从相机出来并进入netstream(
netstream.attachCamera(cam)
)。对于这种情况,没有直接的解决方法,您可以存储亮度和对比度设置(通过过滤效果)当您发布/流式传输视频时,作为flv元数据,但另一端的人必须解码此元数据(即,使用闪存组件或可以解码AMF数据的东西进行播放),为此,请参阅
setDataFrame
NetConnection
方法

对于所有其他内容,您可以使用上述建议的方法,使用
Video.attachCamera
将cam推入
Video
实例中,然后使用
Video.filters=[myFilter]
应用您想要的效果。如果您想让像素变得脏兮兮,可以使用
BitmapData
对象的
draw
属性将视频中的相机图像绘制到位图上进行操作,但必须在
enterFrame
计时器上执行此操作,以保持BitmapData处于syn状态c

var video:Video = new Video(w,h);
video.attachCamera(Camera.getCamera());
var bmd:BitmapData = new BitmapData(w,h);
bmd.draw(video);

希望这能有所帮助

除此之外,格兰特·斯金纳还编写了一个实用程序类来更轻松地处理这个问题:是否有任何官方声明表明无法更改实际的相机数据?因为这是最有效的方法……Adobe ActionScript 3 LiveDocs是您与Flash Player一起使用的API的事实参考。如果有没有列出任何Camera类的方法,可以让您操作来自摄像头驱动程序的传入数据,那么就没有这样的方法,也没有API认可的方法可以做到这一点。我认为这里也没有隐藏的方法和/或未记录的功能。底线:您在Flash Player中无法做到这一点。但是,为了支持其他答案,你可以改变另一个节点上的数据,比如服务器上的数据流。不过,我会用分布式计算的方式来代替。另外,你怎么知道这是做这项工作最有效的方式,以及在判断这项性能时使用的标准是什么?如果是速度,你也不能确定,因为所有事情都是由Flash Player为你完成的,一个你只能假设它是如何工作的。正如一个聪明人所说,测量就是要知道。还要记住,你的对比度/亮度/色调/饱和度偏好可能不适合在另一端观看流的一方,当然假设你正在发布数据,那么也许你可以给他们一些滑块,让他们可以调整这些他们自己。