3

Android Flash モバイル アプリの場合、カメラからプレビュー フレームを取得しようとします。

残念ながら、setMode() を呼び出さない限りカメラの焦点が合っていないため、AIR ビルトイン Camera クラスを使用できません (UI がフリーズするため、受け入れられません)。

そこで、このためのネイティブ拡張を作成することにしました。拡張機能自体は機能しています (NativeCamera.pixels で適切な画像データを取得します) が、FREBitmapData を使用してフレームを送信できません。ActionScript 側では、BitmapData のサイズは適切ですが、黒のままです。

私のJavaコード

package com.jumptomorrow.nativecamera;

import java.nio.ByteBuffer;

import com.adobe.fre.FREBitmapData;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;

public class NativeCameraGrabFrameFunction implements FREFunction {

    @Override
    public FREObject call(FREContext context, FREObject[] object) {
        try {
            FREBitmapData out = null;

            try {
                out = FREBitmapData.newBitmapData(NativeCamera.size.width, NativeCamera.size.height, false, new Byte[]{0xf,0xf,0x0,0x0});
                out.acquire();
                ByteBuffer bb = out.getBits();
                bb = ByteBuffer.wrap(NativeCamera.pixels);
                out.invalidateRect(0, 0, NativeCamera.size.width, NativeCamera.size.height);

            } catch (Exception e) {
                e.printStackTrace();
            } 

            try {
                out.release();
            } catch(Exception e) {
                e.printStackTrace();
            }

            return out;

        } catch (IllegalStateException e) {
            e.printStackTrace();
        } 

        return null;
    }

}

私の ActionScript コード

package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.utils.ByteArray;

    import net.hires.debug.Stats;

    public class camera_test extends Sprite
    {
        private var nc:NativeCameraInterface;
        private var bitmap:Bitmap;

        public function camera_test()
        {
            super();

            // support autoOrients
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            nc = new NativeCameraInterface();
            try {
                nc.startCamera();
            }
            catch(e:Error) {
                trace(e.getStackTrace());
            }

            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        protected function onEnterFrame(event:Event):void
        {
            if(nc) {
                var bmpd:BitmapData = nc.getFrame() as BitmapData;

                try {
                    var bmp:Bitmap = new Bitmap(bmpd);

                    addChild(bmp);
                    bmp.scaleX = bmp.scaleY = 2;

                } catch(e:Error) {
                    trace("failed");
                }
            }
        }
    }
}

誰かがこれが何であるか考えていますか?

4

1 に答える 1

1

これらの行ではありませんか...

ByteBuffer bb = out.getBits();
bb = ByteBuffer.wrap(NativeCamera.pixels);

・・・こんなことになるの?

ByteBuffer bb = out.getBits(); // (no change)
bb.position(0);
bb.put(ByteBuffer.wrap(NativeCamera.pixels));

これにより、 で新しいインスタンスを作成する代わりに、 でByteBuffer取得したインスタンスが変更されます。out.getBits()ByteBufferbb = ByteBuffer.wrap(...)

于 2012-05-02T20:41:54.520 に答える