我正在开发示例应用程序,它通过Android中的Camera提供了指向图像或对象的颜色代码。我的应用程序与此应用程序类似,我正在使用this应用程序代码。
使用此应用程序代码,我可以连续获取相机预览帧,并为我提供当前预览帧的颜色代码。我想让它延迟一些。我希望每500毫秒后只能获得一个相机预览帧。
我怎么能这样做,我需要在这段代码中进行哪些修改。
代码:
Games.Invitations.registerInvitationListener(getApiClient(), this);
Games.TurnBasedMultiplayer.registerMatchUpdateListener(getApiClient(), this);
答案 0 :(得分:0)
您可以在onPreviewFrame()中计算已用时间。例如:
boolean isFirstTime = true;
long startTime = 0;
PreviewCallback callback = new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
if (isFirstTime) {
isFirstTime = false;
startTime = SystemClock.currentThreadTimeMillis();
decodeYUV420SP(pixels, data, previewSize.width, previewSize.height);
listener.OnPreviewUpdated(pixels, previewSize.width, previewSize.height);
}
else {
long currentTime = SystemClock.currentThreadTimeMillis();
long elapsedTime = currentTime - startTime;
if (elapsedTime >= 500) { // trigger your event
startTime = currentTime;
decodeYUV420SP(pixels, data, previewSize.width, previewSize.height);
listener.OnPreviewUpdated(pixels, previewSize.width, previewSize.height);
}
}
}
};
切换预览状态时,不要忘记重置布尔值和开始时间。
答案 1 :(得分:0)
没有什么能保证精确的500毫秒 - 相机硬件没有设置立即响应。不过,你可以非常接近这一点。首先,从后台处理程序线程打开相机(请参阅https://stackoverflow.com/a/19154438/192373)。
public void onPreviewFrame(byte[] data, Camera camera) {
long releaseTime = SystemClock.currentThreadTimeMillis() + 500;
decodeYUV420SP(pixels, data, previewSize.width, previewSize.height);
listener.OnPreviewUpdated(pixels, previewSize.width, previewSize.height);
resetBuffer();
SystemClock.sleep(releaseTime-SystemClock.currentThreadTimeMillis());
}
这假定decodeYUV420SP()
和OnPreviewUpdated()
一起花费的时间远远少于500毫秒。