Android 如何使用setCamera(MediaRecorder)?

Android 如何使用setCamera(MediaRecorder)?,android,camera,mediarecorder,Android,Camera,Mediarecorder,根据Android SDK,MediaRecorder.setCamera可用于回收现有摄像头实例进行视频捕获和预览,而无需重置预览。我找不到任何样本,所有的尝试都是徒劳的:我要么得到错误的状态异常,要么MediaRecorder.prepare失败 有人知道这个方法是否有用吗 那我怎么用呢 网上有样品吗 供参考: 我找到了两个你可能会觉得有用的链接。Android摄像头应用程序源代码提供了最好的例子。经过一些调查,我发现recorder.setCamera(camera)应该在实例化Med

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

  • 有人知道这个方法是否有用吗
  • 那我怎么用呢
  • 网上有样品吗
供参考:

我找到了两个你可能会觉得有用的链接。Android摄像头应用程序源代码提供了最好的例子。经过一些调查,我发现
recorder.setCamera(camera)
应该在实例化
MediaRecorder
后立即调用,或者至少在对其应用任何设置之前调用。调用
setCamera()
之前应用任何设置(
setVideoSource()
等)都会导致错误

创建mediarecorder实例后,您是否尝试过使用以下函数

//解锁相机以允许其他进程访问它

mCameraDevice.unlock()

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

mMediaRecorder.setCamera(mCameraDevice)


我启动了我的MediaRecorder:

MediaRecorder mediaRecorder = null;
但不是这样:

MediaRecorder mediaRecorder = new MediaRecorder();
(头砰)哈哈。。现在我发行的是一个预览版的kalydascope。。是时候搜索互联网站了


希望这对某人有所帮助。

我遇到了同样的问题,并找到了它的工作原理。有些事情必须做对。首先,您应该从中检查状态图

命令的工作顺序如下所示

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"

可以找到完整的示例。

我从@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();
第二步,先设置摄像头,然后再像这样设置其他摄像头

                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;
                }
应该在prepare()之前调用setCamera()


但是我正在观察我的代码是否正常工作。

我可以问一下这个答案被降级的原因吗?考虑到我在回答这个问题时,Android摄像头仍然是这个问题的正确参考。这仅仅是一个懒惰的人在那里寻找他们需要的东西的问题吗?或者你更喜欢评论而不是回复?简单地提供链接,特别是在stackexchange网络网站之外,而不做额外解释,并不是回答问题的最佳做法。如果链接断开,你的答案将是无用的(实际上你的链接现在断开了。请检查)。链接断开了
                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;
                }