Подтвердить что ты не робот

Ошибка MediaRecorder.stop(): -1007

Я записываю видео с MediaRecorder. Мой код отлично работает на 2.3.3, но не работает 4.0.3.

Проблема следующая: код mediaRecorder.stop() выдает RuntimeExeption

java.lang.RuntimeException: stop failed.
    at android.media.MediaRecorder.stop(Native Method)

с сообщением LogCat

04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007

ОБНОВЛЕНИЕ

Я обнаружил, что MediaPlayer сообщает об ошибке (через MediaPlayer.OnErrorListener) почти сразу после запуска. Код ошибки - 100 (сбой медиа-сервера), дополнительный -1007.

ОБНОВЛЕНИЕ 2 Код для подготовки MediaRecorder

            c = Camera.open();

    ...

    // Step 1: Unlock and set camera to MediaRecorder
    camera.unlock();
    mediaRecorder.setCamera(camera);

    // Step 2: Set sources
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    CamcorderProfile profile = CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH);

    // manual set up!

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
    mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
    mediaRecorder.setVideoSize(profile.videoFrameWidth,
            profile.videoFrameHeight);

    mediaRecorder.setAudioChannels(profile.audioChannels);
    mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
    mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);

    mediaRecorder.setAudioEncoder(profile.audioCodec);
    //mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    mediaRecorder.setVideoEncoder(profile.videoCodec);

    // mediaRecorder.setProfile(profile);

    // Step 4: Set output file
    mediaRecorder.setOutputFile("somefile.mp4");

    // Step 5: Set the preview output
    mediaRecorder.setPreviewDisplay(preview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        mediaRecorder.prepare();
    } catch ...
    { release mediaRecorder}

то я простоCall mediaRecorder.start() обратите внимание, что мне нужно, чтобы видео было закодировано в формате mp4. Этот код работает на Samsng Galaxy GIO (android 2.3.3) и не работает, как описано в Acer E305 (android 4.0.2)

Любые идеи? Спасибо.

4b9b3361

Ответ 1

Наконец-то решил. Проблема заключалась в настройке размера предварительного просмотра перед установкой фактического предварительного просмотра для камеры. Размер предварительного просмотра ДОЛЖЕН будет равен выбранному размеру видео.

CamcorderProfile profile = [get required profile];

Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(profile.videoFrameWidth,profile.videoFrameHeight);
mCamera.setParameters(parameters);

mCamera.setPreviewDisplay([surface holder]);
mCamera.startPreview();

...

//configure MediaRecorder and call MediaRecorder.start()

Ответ 2

Указание документации метода "stop" в MediaRecorder.java в 4.0.3:

Остановка записи. Вызвать это после начала(). Как только запись остановлена, вам придется настраивать его снова, как если бы он только что был построен. Обратите внимание, что исключение RuntimeException намеренно приложение, если не были получены достоверные аудио/видео данные, когда вызывается stop(). Это происходит, если stop() вызывается сразу после Начало(). Эта ошибка позволяет приложению принять меры в соответствии с очистить выходной файл (например, удалить выходной файл), поскольку выходной файл не будет правильно сконфигурирован, когда это произойдет.

И тот факт, что MediaPlayer сообщает, что этот "медиа-сервер скончался" по той же причине. Можете ли вы опубликовать остальную часть своего кода, чтобы узнать, есть ли заблуждение, которое может вызвать эту проблему?

Ответ 3

Итак, я обнаружил, что эта ошибка сообщается мне в эмуляторе Android для API 18 (после того, как запись работала нормально в более поздних версиях).

Я обнаружил, что если бы я вызвал Camera.startPreview() до инициализации и начала запуска экземпляра MediaRecorder, я бы получил журнал stop failed: -1007 при вызове MediaRecorder.stop, но если я вызвал Camera.stopPreview() до инициализации my MediaRecorder видео записывается отлично.

Я надеюсь, что это поможет

Ответ 4

У меня возникла такая же проблема на Samsung J4+, Android 9 Pie.

Исправили это, запустив mediaRecorder.start() и mediaRecorder.stop() в обработчике:

private val START = 0;
private val STOP  = 1;

inner class CameraHandler(looper: Looper?): Handler(looper) {

  override fun handleMessage(msg: Message?) {
    super.handleMessage(msg)
      try {
        when (msg?.what) {
          START -> mediaRecorder?.start()
          STOP  -> mediaRecorder?.stop()
        }
      } catch (e: Exception) {
        Log.d("debug", e.message)
      }
  }
}

объявить обработчик:

private lateinit var mCameraHandler: Handler

инициализировать в OnCreate с помощью HandlerThread Looper:

val handlerThread: HandlerThread = HandlerThread("Camera Handler Thread")
handlerThread.start()
mCameraHandler = CameraHandler(handlerThread.looper)

когда нажата кнопка записи или остановки вызова:

mCameraHandler.sendEmptyMessage(START)
mCameraHandler.sendEmptyMessage(STOP)

ссылка на мой грязный код xD