如何使用setCamera(MediaRecorder)?

发布于 2024-09-01 20:38:09 字数 483 浏览 5 评论 0原文

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

  • 有谁知道这个方法是否可用?
  • 那我该如何使用它呢?
  • 网上有可用的示例吗?

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

According to Android SDK MediaRecorder.setCamera can be used to recycle the existing camera instance for video capture and preview without resetting the preview. I was not able to find any sample, and all my attempts were futile: I either get the wrong state exception, or MediaRecorder.prepare fails.

  • Does anyone know if this method usable at all?
  • How can I use it then?
  • Any samples available on the Web?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

⒈起吃苦の倖褔 2024-09-08 20:38:09

我遇到了同样的问题并发现了它是如何工作的。有些事情必须正确完成。首先,您应该从 安卓文档

命令的工作顺序如下。

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"

完整的示例可以在此处。

I ran into the same problem and found out how it can work. Some things have to be done correctly. First you should check the state chart from the android document.

A working order of commands is as follows.

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"

A full example can be found here.

泛泛之交 2024-09-08 20:38:09

Android 相机应用程序源提供了最好的例子。经过一番调查,我发现 recorder.setCamera(camera) 应在实例化 MediaRecorder 之后立即调用,或者至少在对其应用任何设置之前。在调用 setCamera() 之前应用任何设置(setVideoSource() 等)都会导致错误。

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.

厌倦 2024-09-08 20:38:09

我从@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() ()。

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

I got hint from @lyron.

First, open the front camera.

    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();

I need to use the front camera as above.

And DON'T FORGET to UNLOCK the camera.

If you don't, you'll see errors below.

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)

Second, set the camera before setting the others like this.

                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;
                }

Someone says that setCamera() should be called before prepare().

But I'm watching my code is working.

黑白记忆 2024-09-08 20:38:09

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

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

mCameraDevice.unlock();

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

mMediaRecorder.setCamera(mCameraDevice);

Have you tried to use the following functions after creating an instance of mediarecorder?

//Unlocks the camera to allow another process to access it.

mCameraDevice.unlock();

//Sets a Camera to use for recording. Use this function to switch quickly between preview and //capture mode without a teardown of the camera object.

mMediaRecorder.setCamera(mCameraDevice);

靖瑶 2024-09-08 20:38:09

我启动了我的 MediaRecorder:

MediaRecorder mediaRecorder = null;

但不是这样的:

MediaRecorder mediaRecorder = new MediaRecorder();

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

希望这对某人有帮助。

I had my MediaRecorder initiated:

MediaRecorder mediaRecorder = null;

but not like this :

MediaRecorder mediaRecorder = new MediaRecorder();

(headbang) haha.. now my issue is a kalydascope for a preview.. time to search the interwebs..

hopefully this helped someone.

完美的未来在梦里 2024-09-08 20:38:09

我找到了 2 个您可能会觉得有用的链接。 Android 相机 git 存储库MediaRecorder 示例

I found 2 links you may find useful. Android Camera git repo and a MediaRecorder example

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文