1
votes

I do not really know much in regard to Flash or Action Scripts but I have been having a bit of trouble with AS3 and webcams. I have a script that connects to a webcam and then sends its output to a php script that saves the captured image. This works all except for one problem. It seems that the maximum resolution allowed for the actual Camera object is 320x240. I went to the extreme of hooking a Canon 60D up as a webcam because I have a normal webcam that is supposed to have max resolution of 1280x720 and all I can get is a 320x240 image from it. What I have found so far is the max I can get out of the Canon is also 320x240. Maybe I have been looking at this to long but I am stumped. Below is a sample of the action script where videoCapture should be 1024x768. What happens instead is a 1024x768 image is created with a black background and in the top left is a 320x240 image from videoCapture. I could obviously resize this but that would defeat the purpose being poor quality. Is there something I am missing here or maybe some limitation of Flash even?

// 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
What Operating System do you use? - Engineer
I am currently using Windows XP. I have not had a chance to test in anything else. - Brian Shaw
I would definitely try another operating system, look for updated drivers, etc. When you do cam.setMode() and pass in the resolution, it's supposed to try and find the closest resolution that the camera supports. My experience is that doesn't work so well. Try some interim resolutions between 320x240 and 1024x768 to see if you can get something higher than 320x240 to work. - Sunil D.
Thank you for your comment. I did try a number of other smaller resolutions as well. I have not yet had a chance to try it on another OS but I am guessing it will probably be the same story. - Brian Shaw

3 Answers

7
votes

I also just had this problem. Solved it by including the width and height parameters when creating the Video object instead of setting them afterwards via Video.height and Video.width. Once i did that, all bitmapData taken from that video was correctly sized.

This is how i originally created the video that did not work (looked fine, but resulted in incorrectly sized bitmaps):

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

This worked (bitmaps from this video were correctly sized):

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

Would love to know why the first way doesn't work. Maybe that's the bug mentioned above. (I didn't have access to that site so couldn't see it.)

2
votes

Sounds like this bug was never fixed: http://bugs.adobe.com/jira/browse/FP-2138

1
votes

I had a similar issue. What worked for me was that I replaced:

previewPortData.draw(videoCapture);

With:

previewPortData.draw(stage);