Как использовать setCamera (MediaRecorder)? - PullRequest
7 голосов
/ 18 мая 2010

Согласно Android SDK MediaRecorder.setCamera можно использовать для утилизации существующего экземпляра камеры для захвата видео и предварительного просмотра без сброса предварительного просмотра. Я не смог найти ни одного образца, и все мои попытки оказались тщетными: я либо получил неправильное исключение состояния, либо MediaRecorder.prepare завершился неудачей.

  • Кто-нибудь знает, можно ли вообще использовать этот метод?
  • Как я могу использовать это тогда?
  • Какие-либо образцы доступны в Интернете?

Для справки: http://developer.android.com/reference/android/media/MediaRecorder.html#setCamera(android.hardware.Camera)

Ответы [ 6 ]

9 голосов
/ 19 августа 2013

Я столкнулся с той же проблемой и выяснил, как она может работать. Некоторые вещи должны быть сделаны правильно. Сначала вы должны проверить диаграмму состояния из документа 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"

Полный пример можно найти здесь .

7 голосов
/ 21 апреля 2011

Источник приложения Android Camera - лучший пример. После некоторого исследования я обнаружил, что recorder.setCamera(camera) следует вызывать сразу после создания экземпляра MediaRecorder или, по крайней мере, до того, как к нему будут применены какие-либо настройки. Применение любых настроек (setVideoSource() и т. Д.) Перед вызовом setCamera() приводит к ошибке.

3 голосов
/ 02 июня 2015

Я получил подсказку от @ 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 ().

Но я смотрю, мой код работает.

1 голос
/ 26 августа 2011

Вы пытались использовать следующие функции после создания экземпляра медиа-рекордера?

// Разблокирует камеру, чтобы позволить другому процессу получить к ней доступ.

mCameraDevice.unlock ();

// Устанавливает камеру для записи. Используйте эту функцию для быстрого переключения между режимом предварительного просмотра и // захвата без удаления объекта камеры.

mMediaRecorder.setCamera (mCameraDevice);

0 голосов
/ 08 апреля 2013

У меня запущен MediaRecorder:

MediaRecorder mediaRecorder = null;

но не так:

MediaRecorder mediaRecorder = new MediaRecorder();

(headbang) хаха .. теперь моя проблема - калидаскоп для предварительного просмотра .. время для поиска в паутинах ..

надеюсь, это кому-то помогло.

0 голосов
/ 04 февраля 2011

Я нашел 2 ссылки, которые могут оказаться полезными. Android Camera git repo и пример MediaRecorder

...