7

根据Android SDK MediaRecorder.setCamera 可用于回收现有相机实例进行视频采集和预览,无需重置预览。我找不到任何样本,我所有的尝试都是徒劳的:我要么得到错误的状态异常,要么 MediaRecorder.prepare 失败。

  • 有谁知道这种方法是否可用?
  • 那我该怎么用呢?
  • 网络上有任何可用的示例吗?

供参考: http: //developer.android.com/reference/android/media/MediaRecorder.html#setCamera(android.hardware.Camera)

4

6 回答 6

9

我遇到了同样的问题,并发现了它是如何工作的。有些事情必须正确地完成。首先,您应该检查 android 文档中的状态图。

命令的工作顺序如下。

mCamera = Camera.open();
rec = new MediaRecorder();                               // state "Initial"

mCamera.lock();
mCamera.unlock();

rec.setCamera(mCamera);                                  // state still "Initial"
rec.setVideoSource(MediaRecorder.VideoSource.CAMERA);    // state "Initialized"
rec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);  // state "DataSourceConfigured"
rec.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

rec.setPreviewDisplay(surfaceHolder.getSurface());

rec.setOutputFile(Environment.getExternalStorageDirectory() + "/test.mp4");

rec.prepare();                                           // state "Prepared"
rec.start();                                             // state "Recording"

// ...

rec.stop();                                              // state "Initial"

一个完整的例子可以在这里找到。

于 2013-08-19T12:01:55.310 回答
7

The Android Camera app source provides the best example. After some investigation, I discovered that recorder.setCamera(camera) should be called immediately after instantiation of the MediaRecorder, or at least before any settings are applied to it. Applying any settings (setVideoSource(), etc.) before calling setCamera() results in an error.

于 2011-04-21T18:39:00.033 回答
3

我从@lyron 那里得到了提示。

首先,打开前置摄像头。

    int cameraId = -1;
    int camNums = Camera.getNumberOfCameras();

    for( int i = 0 ; i < camNums ; i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if( info.facing == CameraInfo.CAMERA_FACING_FRONT ) {
            cameraId = i;
            break;
        }
    }
    mCamera = Camera.open(cameraId);
    mCamera.unlock();

我需要如上所述使用前置摄像头。

并且不要忘记解锁相机。

如果不这样做,您将在下面看到错误。

E/MediaRecorder(15509): start failed: -19
E/SampleVideoRecorder(15509): Exception : 
E/SampleVideoRecorder(15509): java.lang.RuntimeException: start failed.
E/SampleVideoRecorder(15509):   at android.media.MediaRecorder.start(Native Method)

其次,在设置其他相机之前先设置相机。

                recorder = new MediaRecorder();
                recorder.setCamera( mCamera );   // like this!

                recorder.setAudioSource( MediaRecorder.AudioSource.MIC);
                recorder.setVideoSource( MediaRecorder.VideoSource.CAMERA);
                recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);

                recorder.setVideoSize( 2560, 1440 );
                recorder.setVideoFrameRate(30);

                recorder.setPreviewDisplay(holder.getSurface());
                recorder.setOutputFile( s_dir );

                try {
                    recorder.prepare();
                    recorder.start();
                } catch( Exception e ) {
                    Log.e("SampleVideoRecorder", "Exception : ", e );

                    recorder.release();
                    recorder = null;
                }

有人说setCamera() 应该在 prepare() 之前调用。

但我正在看我的代码正在运行。

于 2015-06-02T09:01:24.920 回答
1

创建 mediarecorder 实例后,您是否尝试过使用以下功能?

//解锁相机以允许另一个进程访问它。

mCameraDevice.unlock();

//设置用于录制的相机。使用此功能可在预览和//捕获模式之间快速切换,而无需拆卸相机对象。

mMediaRecorder.setCamera(mCameraDevice);

于 2011-08-26T07:14:18.403 回答
0

我启动了 MediaRecorder:

MediaRecorder mediaRecorder = null;

但不是这样:

MediaRecorder mediaRecorder = new MediaRecorder();

(headbang)哈哈..现在我的问题是预览的kalydascope..是时候搜索互联网了..

希望这对某人有所帮助。

于 2013-04-07T23:29:58.237 回答
-4

我发现了 2 个您可能会觉得有用的链接。Android Camera git repoMediaRecorder 示例

于 2011-02-04T01:05:48.350 回答