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

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

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

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

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


person Adam    schedule 18.01.2012    source источник
comment
не могли бы вы предоставить код вашей деятельности по захвату видео? особенно когда вызывается метод stop()   -  person HitOdessit    schedule 03.10.2012
comment
Любая дополнительная информация об этом? Здесь точно такая же проблема.   -  person aaronsnoswell    schedule 01.11.2012
comment
Я столкнулся с той же проблемой при попытке запустить демонстрационное приложение VoiceRecorder из главы 16 Deitel et al. Андроид для программистов. У меня есть Nitro HD с Gingerbread. Что плохо, так это то, что мне приходится перезагружать телефон, чтобы освободить MediaRecorder... :-(   -  person dom_beau    schedule 24.03.2013


Ответы (9)


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

captureButton.setText("start");

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

captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main);

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

person vida    schedule 18.09.2013
comment
То же самое .. Та же проблема для меня .. раскомментирование setText сработало для меня. - person santiago_apr1; 09.06.2014

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

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

camera.stopPreview();
camera.release();
person gool    schedule 28.05.2015
comment
Спасибо за ответ. Я пытался решить это в течение 2 дней. - person aacanakin; 26.02.2016
comment
Спаситель! Это должен быть ответ :) - person Cristiano Coelho; 05.09.2019

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

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

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

user2171513 ответил:

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

person EECOLOR    schedule 14.03.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.

    }
person Sharad Mhaske    schedule 16.04.2013
comment
Этот ответ нуждается в дополнительных пояснениях, чтобы быть полезным. - person Frank Schwieterman; 07.09.2014

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

person jerry    schedule 30.10.2013

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

person Taranfx    schedule 24.06.2014

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

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

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

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

person Dave T.    schedule 11.05.2015

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

person Ilya Gazman    schedule 07.10.2015