onPreviewFrame返回倾斜的YUV数据

时间:2011-08-18 03:49:52

标签: java android android-camera

好吧,我的智慧结束了。我正在编写一个机器人应用程序,它接收预览数据,对其进行处理,然后将更改的数据显示在屏幕上。到目前为止一切都那么好 - 除了在一些不确定的时间(通常是一两分钟)之后,在onPreviewFrame回调期间进入的YUV数据被...滚动...水平。我把原始的yuv抓到了SD卡:

[看起来我还不能在这里发布图片,所以这里是网址:raw yuv capture]

这是我的第一个机器人应用程序,但我花了很多时间研究各种桌面视频软件。当我看到这个时,我立即想到的是我遇到了一个线程同步问题,并且缓冲区因为它而以某种奇怪的方式被覆盖。

我的代码最初使用了一个工作线程。因此,为了消除问题是线程相关的这种可能性,我将工作线程取出并将所有内容放在onPreviewFrame中。同样,同样的问题:扭曲的YUV数据。

然后我做了一些谷歌搜索,发现onPreviewFrame内部的重处理可能会导致随机的怪异。为了规避 ,我将回调更改为OneShot变种,这导致了我现在使用的代码:

public void surfaceCreated(SurfaceHolder holder) {
    Log.i(TAG, "surfaceCreated");
    mCamera = Camera.open();
    mCamera.setOneShotPreviewCallback(new PreviewCallback() {

        public void onPreviewFrame(byte[] data, Camera camera) {

            Canvas canvas = mHolder.lockCanvas();
            try
            {             
                Bitmap bmp = processFrame(data);
                if (bmp != null) {

                    if (canvas != null) {
                        canvas.drawBitmap(bmp, (canvas.getWidth() - getFrameWidth()) / 2, (canvas.getHeight() - getFrameHeight()) / 2, null);                           
                    }
                    bmp.recycle();
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                mHolder.unlockCanvasAndPost(canvas);
                mCamera.setOneShotPreviewCallback(this);
            }
        }
    });
}

不幸的是,我仍然得到了偏斜的yuv数据。

我的测试设备是HTC EVO 4G。我知道这款手机有它的问题,但是我很想把它归结为硬件错误,主要是因为我几乎可以肯定它是由程序员错误造成的。问题是,我已经把我的代码削减到了骨头,问题仍然存在。

以前有人遇到过这个吗?

1 个答案:

答案 0 :(得分:3)

好吧,看起来这是HTC手机的一个问题。 This是我遇到的确切问题。 Over here他们说这是由于后置摄像头镜头松动造成的,解决方法是用拇指将其推入几秒钟以便重新安装。

毕竟不是软件问题。