如何在每500ms后获取相机预览帧

时间:2015-06-01 00:51:50

标签: java android camera android-camera

我正在开发示例应用程序,它通过Android中的Camera提供了指向图像或对象的颜色代码。我的应用程序与此应用程序类似,我正在使用this应用程序代码。

使用此应用程序代码,我可以连续获取相机预览帧,并为我提供当前预览帧的颜色代码。我想让它延迟一些。我希望每500毫秒后只能获得一个相机预览帧。

我怎么能这样做,我需要在这段代码中进行哪些修改。

代码:

Games.Invitations.registerInvitationListener(getApiClient(), this);

Games.TurnBasedMultiplayer.registerMatchUpdateListener(getApiClient(), this);

2 个答案:

答案 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毫秒。