2012-01-18 2 views
20

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

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

Вт/CameraSource (YYYYY): Тайм-аут в ожидании входящего видео камеры кадров: XXXXXX нам

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

+0

Вы могли бы предоставить код Вашей деятельности "Видеозахват"? особенно, когда метод stop() получил вызов – HitOdessit

+0

Дополнительная информация по этому вопросу? Здесь есть одна и та же проблема. – aaronsnoswell

+0

Просьба указать код. –

ответ

0

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

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

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

user2171513 ответил:

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

0

чек this-

  @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

Этот ответ требует больше объяснений, чтобы быть полезным. –

5

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

captureButton.setText("start"); 

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

captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main); 

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

+1

Ditto .. Тот же вопрос для меня .. раскомментирование setText сработало для меня. –

0

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

0

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

0

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

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

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

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

3

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

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

camera.stopPreview(); 
camera.release(); 
+0

Thanks для ответа. Я пытался решить это в течение 2 дней. – aacanakin

0

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

Смежные вопросы