编程语言
首页 > 编程语言> > java-onPreviewFrame返回偏斜的YUV数据

java-onPreviewFrame返回偏斜的YUV数据

作者:互联网

好吧,我快要死了.我正在编写一个droid应用,该应用接收预览数据,对其进行处理,然后将更改后的数据显示在屏幕上.到目前为止一切顺利-除了经过一段时间的不确定性(通常是一两分钟)之后,onPreviewFrame回调期间输入的YUV数据…水平地滚动了.我将原始的yuv捕获到了SD卡中:

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

这是我的第一个droid应用,但是我花了很多时间来开发各种桌面视频软件.当我看到这时,我立即想到的是我遇到了线程同步问题,并且由于这个原因,缓冲区以某种奇怪的方式被覆盖.

我的代码最初确实使用了工作线程.因此,为了消除该问题与线程有关的可能性,我取出了工作线程并将所有内容放入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.我知道这部手机有问题,但我仍谨慎地将其归咎于硬件错误,主要是因为我几乎可以肯定这是由于程序员错误引起的.问题是,我已经将代码精简了,问题仍然很明显.

有人遇到过吗?

解决方法:

好吧,看来这是HTC手机的问题. This是我遇到的确切问题.他们说是Over here,这是由于后摄像头镜头松动引起的,解决方案是用拇指用力将其推入几秒钟以使其复位.

毕竟不是软件问题.

标签:android-camera,java,android
来源: https://codeday.me/bug/20191208/2088462.html