在运行时调整摄像头和视频显示的大小

时间:2012-10-27 20:09:19

标签: actionscript-3 flex air flex4 flex4.5

我有一个视频播放(火花)和相机。

     public var camera:Camera;
     ...
     livePreview.source = getDynamicStreamingVideoSource();
     camera.setMode(camWidth, camHeight, 15);
     livePreview.videoObject.attachCamera(camera);
     ...
     <s:VideoDisplay id="livePreview" ... />

在某些情况下,在我的代码中的某个地方,我尝试通过调用camera.setMode(newWidth,newHeight)并设置livePreview.width = newWidth,livePreview.height = newHeight来以编程方式调整大小。从我所看到的情况来看,这并不好用。 livePreview 调整到新的宽度和高度但不是相机,至少部分。 例如,原始尺寸为250,250,如果我将500(W)和250(H)设置为新尺寸,相机视频将在水平方向上展开,但物理宽度保持在250.现在这里是捕捉,如果我将livePreview.scaleMode设置为“拉伸”,摄像机视频将按照我想要的方式显示视频(未失真,正确尺寸,比例完整)。

现在我的真正问题是:这在性能方面效果不佳。 “拉伸”真的告诉你它正在拉伸视频,至少需要一秒钟来完成它。太慢了。我想让它瞬间完成,没有任何影响。当我指定正确的宽度并且与videoDisplay宽度相同时,我也不明白为什么需要拉伸它。我在这里失踪了吗?

1 个答案:

答案 0 :(得分:0)

我偶然发现了ActionScript 3.0 Cookbook(配方16.6,第398-399页)中的内容。我不会直接引用,尊重版权,但这里是一个总结。我希望这是你正在寻找的东西:

我不知道你是否真的创建了一个Video对象(或者你可以),但书中说视频回放的尺寸取决于Video对象的宽度和高度属性。

var video:Video = new Video(160, 120);
//Now we change the dimensions of the video to scale it up to twice the size.
video.width = 320;
video.height = 240;

虽然我没有使用Camera对象的直接经验,但我想如果你要从Camera对象创建一个Video对象(我甚至不知道怎么做,或者你可以。或许,另一个问题,然后你可以直接调整视频的尺寸。

现在听起来的是视频显示对象试图显示比可用分辨率更高的分辨率,因此,它会使视频像素化。这就像试图在平板电脑上显示一张邮票大小的全屏视频......那里没有足够的实际像素数据,因此像素本身就会被放大。

您必须找到直接调整视频大小的方法,而不仅仅是videoDisplay容器。

我不知道这是否有帮助,特别是因为我不是视频专家,但也许这会给你一些想法......?

编辑:我找到了如何从相机中获取视频(from another SO Question!),所以这是我推荐的用于扩展视频的完整代码:

var camera:Camera = Camera.getCamera();
//You'll want to set the camera's quality and mode.

//Get video from camera.
var video:Video = new Video(160,120);
video.attachCamera(camera);

//Size up video to 320x240.
video.width = 320;
video.height = 240;

//Now, connect the video to the LivePreview object, 
//instead of connecting the camera and the preview directly.

最后一个建议...尝试以您想要的最高分辨率从相机获取输入并向下缩放,而不是向上缩放。这将保持质量。

代码未经测试,因此可能需要调整。同样,我希望这能让你开始解决你的问题!