【问题标题】:setOneShotPreviewCallback not hitting onPreviewFrame() in callbacksetOneShotPreviewCallback 没有在回调中点击 onPreviewFrame()
【发布时间】:2013-05-06 18:09:11
【问题描述】:

我正在为我正在制作的应用程序创建一个视频捕获 Activity,我还想捕获一个预览帧以用作播放按钮。我在onCreate(...) 中设置了SurfaceView,并在SurfaceHolder.Callback 中连接了相机的预览显示:

private Callback mSurfaceViewCallback = new Callback() {

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mSurfaceCreated = false;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mSurfaceCreated = true;
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        try {
            mSurfaceCreated = true;
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
};

这适用于静态相机应用程序。在onPause()onResume()中开启和关闭相机预览:

@Override
protected void onResume() {
    super.onResume();
    if(mCamera!=null)
        mCamera.startPreview();
}

@Override
protected void onPause() {
    if(mCamera!=null)
        mCamera.stopPreview();
    super.onPause();
}

我已经像这样设置了MediaRecorder

protected void startRecording() {
    mMediaRecorder = new MediaRecorder();
    mCamera.unlock();
    mMediaRecorder.setCamera(mCamera);
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));

    mMediaRecorder.setMaxDuration(10000);
    mMediaRecorder.setOutputFile(new File(getFilesDir(), mChallengeUUID + ".mp4").getAbsolutePath());
    mMediaRecorder.setPreviewDisplay(mHolder.getSurface());
    try {
        mMediaRecorder.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mCamera.setOneShotPreviewCallback(mPreviewCallback);
    mMediaRecorder.start();
}

但是,倒数第二行不起作用。错过了我的Camera.PreviewCallbackonPreviewFrame(...) 方法。

正如我所说,拥有它的目的是从录制视频的开头获取一帧以显示给用户。为什么回调没有被命中?

【问题讨论】:

    标签: android callback android-camera preview android-mediarecorder


    【解决方案1】:

    mCamera.unlock() 将相机从进程中分离出来。需要调用:

    mCamera.reconnect();
    

    调用前:

    mCamera.setOneShotPreviewCallback(mPreviewCallback);
    

    (但在其他一切之后)。

    【讨论】:

    • 这对我不起作用。如果我在 mMediaManager.start 之前调用 mCamera.reconnect,则启动失败。如果我在开始后调用它,那么 setOneShotPreviewCallback 将被忽略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 2021-04-27
    • 2019-02-18
    • 2012-06-02
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多