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

MediaRecorder.stop() висит с Android 4.0 (ICS)

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

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

W/CameraSource (YYYYY): время ожидания входящего видео камеры рамки: XXXXXX us

Кто-нибудь еще видел это поведение? Любые обходные пути?

4b9b3361

Ответ 1

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

captureButton.setText("start");

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

captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main);

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

Ответ 2

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

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

camera.stopPreview();
camera.release();

Ответ 3

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

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

Ответ 4

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

user2171513 ответил:

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

Ответ 5

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

            @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.

    }

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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