基本上,我要完成的工作是将摄像机的视图预览到屏幕上,然后对线程中可用的每个图像执行一些背景处理。
我尝试依次运行下面的代码(没有线程),该代码可以正常工作,但是由于进行了大量的处理,相机开始出现很多卡顿现象。一旦将处理代码放在线程上,摄像头就会再次平稳运行,但是该线程永远不会完成其功能(其处理不会提供任何输出)。奇怪的是,当我一一调试线程(调试它们好像是顺序的)时,代码确实会提供其处理的输出。
private final ImageReader.OnImageAvailableListener imageAvailableListener =
new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Log.d(LOG_TAG, "Image frame available.");
final Image image = reader.acquireLatestImage();
if (image == null) return;
final byte[] imageBytes = ImageUtil.imageToByteArray(image);
image.close();
if (frameProcessingLock.tryAcquire()) {
new Thread(new Runnable() {
@Override
public void run() {
Log.d(LOG_TAG, "Performing image processing.");
//Perform processing here - output that it is complete
frameProcessingLock.release();
}
}).start();
}
}
};
我使用了一个信号量“ frameProcessingLock”来确保读取器一次只处理一个图像(仅一个就足够了)-如果线程仍然很忙,它将跳过下一个图像的处理。这就是使相机继续平稳运行的原因。我有一种尝试使用线程的感觉吗?不太确定,但是任何帮助将不胜感激。