Разрешение / размер веб-камеры AS3 - PullRequest
1 голос
/ 09 марта 2012

Я не очень много знаю о Flash или Action Scripts, но у меня возникли небольшие проблемы с AS3 и веб-камерами. У меня есть сценарий, который подключается к веб-камере, а затем отправляет свой вывод в сценарий php, который сохраняет захваченное изображение. Это работает все, кроме одной проблемы. Кажется, что максимальное разрешение, разрешенное для реального объекта Camera, составляет 320x240. Я дошел до крайности подключения Canon 60D в качестве веб-камеры, потому что у меня есть обычная веб-камера, которая должна иметь максимальное разрешение 1280x720, и все, что я могу получить, - это изображение размером 320x240. До сих пор я обнаружил, что максимум, который я могу получить от Canon, также составляет 320x240. Может быть, я долго смотрел на это, но я в тупике. Ниже приведен пример сценария действия, где videoCapture должен иметь размер 1024x768. Вместо этого получается изображение размером 1024x768 с черным фоном, а в левом верхнем углу - изображение размером 320x240 из videoCapture. Я, конечно, мог бы изменить это, но это побеждало бы цель, являющуюся плохим качеством. Есть ли что-то, чего я здесь не хватает, или, может быть, есть какое-то ограничение даже во 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);

}

Ответы [ 3 ]

7 голосов
/ 13 июня 2012

У меня тоже была эта проблема. Решено это путем включения параметров ширины и высоты при создании объекта Video вместо их последующей настройки через Video.height и Video.width. Как только я это сделал, все bitmapData, взятые из этого видео, имели правильный размер.

Вот как я изначально создал видео, которое не работает (выглядело хорошо, но привело к неправильным размерам растровых изображений):

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

Это сработало (растровые изображения из этого видео были правильного размера):

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

Хотелось бы знать, почему первый способ не работает. Может быть, это ошибка, упомянутая выше. (У меня не было доступа к этому сайту, поэтому я не мог его увидеть.)

2 голосов
/ 02 апреля 2012

Похоже, эта ошибка никогда не была исправлена: http://bugs.adobe.com/jira/browse/FP-2138

1 голос
/ 24 апреля 2012

У меня была похожая проблема. Для меня сработало то, что я заменил:

previewPortData.draw(videoCapture);

С:

previewPortData.draw(stage);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...