【问题标题】:AS3 webcam resolution/size issueAS3 网络摄像头分辨率/尺寸问题
【发布时间】:2012-03-09 09:49:42
【问题描述】:

我对 Flash 或动作脚本知之甚少,但我在使用 AS3 和网络摄像头时遇到了一些麻烦。我有一个连接到网络摄像头的脚本,然后将其输出发送到保存捕获图像的 php 脚本。除了一个问题外,这一切都有效。实际相机对象允许的最大分辨率似乎是 320x240。我将佳能 60D 作为网络摄像头连接到了极致,因为我有一个正常的网络摄像头,它的最大分辨率应该是 1280x720,而我只能从中得到 320x240 的图像。到目前为止,我发现佳能的最大分辨率也是 320x240。也许我一直在看这个很长时间,但我很难过。以下是 videoCapture 应为 1024x768 的操作脚本示例。相反,一个 1024x768 的图像是用黑色背景创建的,左上角是来自 videoCapture 的 320x240 图像。我显然可以调整它的大小,但这会破坏质量差的目的。有什么我在这里遗漏的,或者可能是 Flash 的一些限制吗?

// adds event listener to the stage for keydown events.
stage.addEventListener(KeyboardEvent.KEY_DOWN, detectEnterKey);

import flash.display.Bitmap;
import flash.display.BitmapData;
import com.adobe.images.JPGEncoder;
import flash.ui.Keyboard;
import flash.events.KeyboardEvent;

var bandwidth:int = 0;
var quality:int = 100; 

var cam:Camera = Camera.getCamera();

var videoCapture:Video = new Video();

var previewPortData:BitmapData = new BitmapData(1024, 768, true, 0x00000000);
var previewPort:Bitmap = new Bitmap(previewPortData);

function onCameraStatus(evt):void {
  if (evt.code == "Camera.Muted") {
    Security.showSettings(SecurityPanel.CAMERA);
  }
}

// detects the keycode looking for enter key pressed.
function detectEnterKey(event:KeyboardEvent):void {
  //trace("keycode: "+event.keyCode);
  if (event.keyCode == Keyboard.ENTER) {
    previewPortData.draw(videoCapture);
    var myEncoder:JPGEncoder = new JPGEncoder(100);
    var byteArray:ByteArray = myEncoder.encode(previewPortData);
    var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
    var saveJPG:URLRequest = new URLRequest("save.php");
    saveJPG.requestHeaders.push(header);
    saveJPG.method = URLRequestMethod.POST;
    saveJPG.data = byteArray;
    var urlLoader:URLLoader = new URLLoader();
    urlLoader.addEventListener(Event.COMPLETE, sendComplete);
    urlLoader.load(saveJPG);

    function sendComplete(event:Event):void {
      trace("compete");
    }   
  }
}

if (cam == null) {

  Security.showSettings(SecurityPanel.CAMERA);

} else {

  cam.addEventListener(StatusEvent.STATUS, onCameraStatus)
  cam.setQuality(bandwidth, quality);
  cam.setMode(1024, 768, 30, false);

  videoCapture.attachCamera(cam);
  videoCapture.width = 1024;
  videoCapture.height = 768;
  addChild(videoCapture);

  previewPort.x = 430;
  previewPort.y = 50;
  addChild(previewPort);

}

【问题讨论】:

  • 你使用什么操作系统?
  • 我目前使用的是 Windows XP。我还没有机会测试其他任何东西。
  • 我肯定会尝试其他操作系统,寻找更新的驱动程序等。当您执行 cam.setMode() 并传入分辨率时,它应该尝试找到相机支持的最接近的分辨率.我的经验是,效果不太好。尝试一些介于 320x240 和 1024x768 之间的临时分辨率,看看是否可以让高于 320x240 的分辨率工作。
  • 感谢您的评论。我也尝试了一些其他较小的分辨率。我还没有机会在另一个操作系统上尝试它,但我猜它可能会是同一个故事。

标签: actionscript-3 webcam


【解决方案1】:

我也遇到了这个问题。通过在创建 Video 对象时包含宽度和高度参数而不是之后通过 Video.height 和 Video.width 设置它们来解决它。一旦我这样做了,从该视频中获取的所有 bitmapData 的大小都是正确的。

这就是我最初创建视频的方式不工作(看起来不错,但导致位图大小不正确):

var vid = new Video();
vid.width = 640;
vid.height = 480;
...

这有效(此视频中的位图大小正确):

var vid = new Video(640, 480);
...

很想知道为什么第一种方法不起作用。也许这就是上面提到的错误。 (我无权访问那个网站,所以看不到它。)

【讨论】:

  • 这对我有用,谢谢。在我看来,这绝对是一个错误。 help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/… 的官方文档声明“您还可以在初始构造后使用 Video.width 和 Video.height 设置 Video 对象的宽度和高度属性。”这意味着通过构造函数传递值应该等同于之后设置它们。
【解决方案2】:

听起来这个错误从未修复:http://bugs.adobe.com/jira/browse/FP-2138

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。对我有用的是我替换了:

    previewPortData.draw(videoCapture);
    

    与:

    previewPortData.draw(stage);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 2010-11-01
      • 1970-01-01
      相关资源
      最近更新 更多