【问题标题】:How to use Android Camera in Background?如何在后台使用 Android 相机?
【发布时间】:2013-10-17 11:46:46
【问题描述】:

我目前正在开发一个需要在后台录制视频并进行处理的应用。

(需要在后台实时获取相机预览数据,并对预览数据进行图像处理)

但是,要实现它,我需要使用Camera和OpenCV as Service,而且似乎无法在OpenCV和Android.Hardware.Camera中使用JavaCameraView而不使用任何预览。

这是我的问题。

  1. 听说 OpenCV 中的 NativeCamera 可以用于此目的。可能吗? (可能有例子?)

  2. 有什么方法可以让我使用 JavaCameraView(或类似的东西)来达到这个目的吗?我目前使用 Galaxy S4。

  3. 如果android不支持这种方法,是否有任何可能的解决方法?(使用相机预览而不使用任何表面视图,或处理相机数据而不使用预览)

  4. (可选)为什么android不支持这种操作?很烦人!

感谢您回答问题。

【问题讨论】:

标签: android opencv service background camera


【解决方案1】:

您可以使用服务在后台启动相机。您可以参考this。希望这会对你有所帮助。

【讨论】:

  • 问题是Service中实现camera的常用方法不行。
  • 许多人建议使用 Dummy Surfaceview,或者使 SurfaceView 几乎不可见(通过使其非常小),但我的设备上的虚拟 SurfaceView 失败了。此外,不能使用surfaceview,因为我需要开发这样的相机即使我浏览其他应用程序也可以工作(因为我想将它应用于基于运动的UI目的),这将导致surfaceview(无论大小) 被销毁。
【解决方案2】:

是的可以通过以下步骤..

创建一个活动,它将在某些事件上启动您的后台服务,或者您也可以使用警报管理器根据您的要求启动和停止服务。

请参阅以下对您有帮助的代码。

public boolean starMediaRecording(){
        Camera.Parameters params = mServiceCamera.getParameters();
        mServiceCamera.setParameters(params);
        Camera.Parameters p = mServiceCamera.getParameters();

        final List<Size> listSize = p.getSupportedPreviewSizes();
        Size mPreviewSize = listSize.get(2);
        p.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
        p.setPreviewFormat(PixelFormat.YCbCr_420_SP);
        mServiceCamera.setParameters(p);

        try {
            mServiceCamera.setPreviewDisplay(mSurfaceHolder);
            mServiceCamera.startPreview();
        }
        catch (IOException e) {
            Log.e(TAG, e.getMessage());
            e.printStackTrace();
        }

        mServiceCamera.unlock();

        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera(mServiceCamera);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        mMediaRecorder.setOutputFile("/sdcard/filenamevideo.mp4");
        mMediaRecorder.setVideoFrameRate(30);
        mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height);
        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

        mMediaRecorder.prepare();
        mMediaRecorder.start(); 

        mRecordingStatus = true;

        return true;

}

public void stopMediaRecorder() {
    mServiceCamera.reconnect();

    mMediaRecorder.stop();
    mMediaRecorder.reset();

    mServiceCamera.stopPreview();
    mMediaRecorder.release();

    mServiceCamera.release();
    mServiceCamera = null;
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2015-03-29
  • 2011-11-15
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多