好吧,我的智慧结束了。我正在编写一个机器人应用程序,它接收预览数据,对其进行处理,然后将更改的数据显示在屏幕上。到目前为止一切都那么好 - 除了在一些不确定的时间(通常是一两分钟)之后,在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。我知道这款手机有它的问题,但是我很想把它归结为硬件错误,主要是因为我几乎可以肯定它是由程序员错误造成的。问题是,我已经把我的代码削减到了骨头,问题仍然存在。
以前有人遇到过这个吗?