MediaRecorder.stop () висит с Android 4.0 (ICS) - PullRequest
21 голосов
/ 18 января 2012

При вызове stop() в рамках действия «Видеозахват» программное обеспечение иногда зависает и не возвращается к жизни.Только запуск ANR нажатием «Назад» позволит мне убить действие.

В журнале я вижу следующую строку, повторяющуюся снова и снова:

W / CameraSource (ГГГГ): Тайм-аут ожидания входящих видеокадров с камеры: XXXXXX us

Кто-нибудь еще видел такое поведение?Есть обходные пути?

Ответы [ 9 ]

5 голосов
/ 18 сентября 2013

Мы долго боролись за эту проблему.Мы только что скопировали код от разработчика Android site для захвата видео, но приложение зависает до вызова mediarecorder.stop ().После отладки почти построчно, я узнал ff.Строка вызывает проблему:

captureButton.setText("start");

Я закомментировал это, и остановка медиа-рекордера больше не вызовет ANR.Что я сделал вместо того, чтобы изменить текст кнопки, я просто изменил фон.

captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main);

Не видя ваш код, я не уверен, есть ли у нас та же причина проблемы, но это исправляетмой.Я все еще ищу, почему это происходит для settext (), а не для setBackgroundResource.Я предполагаю, что это как-то связано с заданием background / async, но это все еще предположение.

4 голосов
/ 28 мая 2015

Это также случилось со мной, потому что я отпускал камеру перед выполнением остановки () на рекордере.Это также объясняет сообщение об ошибке «Тайм-аут ожидания входящих видеокадров камеры».Он ждет камеру, которая уже выпущена.Обязательно остановите рекордер - и только затем отпустите камеру:

mMediaRecorder.stop();
mMediaRecorder.release();

camera.stopPreview();
camera.release();
0 голосов
/ 07 октября 2015

В моем случае я пытался остановить запись на Activity.onStop, когда я переместил вызов на MediaRecorder.stop на Activity.onPause, это решило мою проблему.

0 голосов
/ 12 мая 2015

В моем случае причина этого состояла в том, что я остановил предварительный просмотр камеры, изменил разрешение предварительного просмотра, а затем перезапустил предварительный просмотр во время записи.Примерно так, если бы вы сжимали все вызовы метода:

camera.startPreview();
camera.unlock();

recorder = new MediaRecorder();
recorder.setCamera(camera);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(24);
recorder.setVideoEncodingBitRate(3000000);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setOutputFile(output.getAbsolutePath());
recorder.setPreviewDisplay(holder.getSurface());
recorder.prepare();
recorder.start();

camera.stopPreview();
Camera.Parameters cameraParameters = camera.getParameters();
cameraParameters.setPreviewSize(x, y);
camera.setParameters(cameraParameters);
camera.startPreview();

recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
camera.lock();
camera.stopPreview();

На самом деле причина, по которой размер предварительного просмотра был изменен после начала записи, сложна и зависит от конкретной области, поэтому я сохранюподробности.Однако смысл тот же: вы не можете изменить размер предварительного просмотра, не останавливая его, но вы не можете остановить предварительный просмотр после запуска устройства записи на носитель.Я уверен, что есть другие вещи, которые могут вызвать это, как любое другое количество параметров камеры.

Обязательно убедитесь, что камера не потревожена во время записи видео.

0 голосов
/ 24 июня 2014

Возможно, вы запускаете предварительный просмотр и инициацию медиа-записи в onCreate (). Переместите это в более позднюю точку или добавьте new Handler.postDelayed(runnable, 1000);

0 голосов
/ 30 октября 2013

У меня тоже есть такая ошибка. Моя активность содержит мутативный SurfaceView, который отображает предварительный просмотр , поэтому после начала записи start ширина SurfaceView сократилась rink, и я не смог остановить запись , получить ошибку ANR。 Я решил проблему, установив размер SurfaceView。 Надеюсь, это поможет

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

проверить это-

            @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        releaseMediaRecorder();
        releaseCamera();
    }
     private void releaseMediaRecorder(){
          if (recorder != null) {
              recorder.reset();   // clear recorder configuration
              recorder.release(); // release the recorder object
              recorder = null;
              camera.lock();           // lock camera for later use
          }
      }

      private void releaseCamera(){
          if (camera != null){
              camera.release();        // release the camera for other applications
              camera = null;
          }
      }
             public void stopRecording() { // Toast.makeText(this,"Inside the stop                   recording",Toast.LENGTH_SHORT).show();
        //  camera.unlock();
        recorder.stop();
                // recorder.reset();
        recorder.release();#release the recorder after stop important.

    }
0 голосов
/ 15 марта 2013

Я случайно отклонил ответ во время обзора, который был дан с использованием «редактирования» вопроса:

user2171513 ответил:

Я столкнулся ста же проблема и решение, которое я нашел, было добавить mCamera.lock ();прямо перед mCamera.unlock ();перед настройкой камеры в MediaRecorder ..

0 голосов
/ 22 ноября 2012

Я бы порекомендовал вам сделать это в фоновом потоке, чтобы ваше приложение не зависало, даже если метод stop() блокирует:

    new Thread("STOP_RECORDER") {
        public void run() {
            Log.d(TAG, "Stopping recorder...");
            mediaRecorder.stop();
            Log.d(TAG, "Recorder successfully stopped");
        }
    }.start();
...