【问题标题】:resizing camera and videodisplay during runtime在运行时调整相机和视频显示的大小
【发布时间】:2012-10-17 17:05:07
【问题描述】:

我有一个视频显示器(Spark)和相机。

     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 以编程方式调整两者的大小。从我所看到的情况来看,这并不奏效。实时预览 至少部分调整到新的宽度和高度,但不是相机。 例如,原始尺寸是 250、250,如果我将 500 (W) 和 250 (H) 设置为新尺寸,摄像机视频将水平显示为挤压,但物理宽度保持在 250。现在这是关键,如果我将 livePreview.scaleMode 设置为“拉伸”,相机视频将完全按照我想要的方式显示视频(不失真,大小正确,比例完好)。

现在是我真正的问题:这在性能方面效果不佳。 “拉伸”确实向您展示了它正在拉伸视频,至少需要一秒钟才能完成。太慢了。我希望它在没有任何影响的情况下立即工作。我也不明白为什么在我指定正确的宽度并且与 videoDisplay 宽度相同时需要拉伸它。我在这里失踪了吗?

【问题讨论】:

  • 我不明白。你为什么要捕捉相机(例如 4:3 或 16:9 等)并试图让它以 1:1 或 2:1 的比例显示?
  • 好吧,我这样做是因为它让我:P 如果我在 setMode() 中指定一个正方形区域,它会显示一个正方形。不管怎样,我想了想,我想我只是为了得到想要的结果而作弊。
  • 只是一个更新:我的解决方法是根本不调整视频大小,而是从捕获的图像中“剪切”部分,并掩盖不应该成为切片位图一部分的部分。

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


【解决方案1】:

我在 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.

最后一个建议...尝试以您想要的最高分辨率从相机获取输入,然后缩小而不是放大。这样可以保持质量。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多