Intereting Posts

Сбой Android MediaRecorder

ОБНОВЛЕНО:

Хорошо, после нескольких дней тестирования и отладки … Я ПОЛУЧИЛ РАБОТУ, но не так, как хочу.

Причина, по которой она разбилась ранее, была из-за «переориентации» камеры во время блокировки экрана, по-видимому, что часто происходит сбой.

Как только я заставил его использовать ландшафтный режим, он работает. Однако я не хочу, чтобы он использовал ландшафтный режим; Я хочу, чтобы он работал в портретном режиме.

Код берется непосредственно из образца Android Studio (Media -> MediaRecorder). Образец имел код, работающий в ландшафтном режиме, и я не могу понять, как заставить его использовать портретный режим, чтобы я мог избежать переориентации и, таким образом, избежать сбоев?

Нет ничего в onPause, onResume-код и указатель на стек, указывающий на вызов этого метода.

Легкий репродукция:

1) Используйте Android Studio, чтобы получить приложение примера MediaRecord. 2) В манифесте, изменить, android: screenOrientation = "landscape"> в Portrait. 3) Приложение не будет запускаться сейчас.

Я добавил mCamera.setDisplayOrientation (90), то же самое.

Код:

@TargetApi(Build.VERSION_CODES.HONEYCOMB) private boolean prepareVideoRecorder(){ // BEGIN_INCLUDE (configure_preview) mCamera = CameraHelper.getDefaultCameraInstance(); // We need to make sure that our preview and recording video size are supported by the // camera. Query camera to find all the sizes and choose the optimal size given the // dimensions of our preview surface. Camera.Parameters parameters = mCamera.getParameters(); List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes(); Camera.Size optimalSize = CameraHelper.getOptimalPreviewSize(mSupportedPreviewSizes, mPreview.getWidth(), mPreview.getHeight()); // Use the same size for recording profile. CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); profile.videoFrameWidth = optimalSize.width; profile.videoFrameHeight = optimalSize.height; // likewise for the camera object itself. parameters.setPreviewSize(profile.videoFrameWidth, profile.videoFrameHeight); mCamera.setParameters(parameters); try { // Requires API level 11+, For backward compatibility use {@link setPreviewDisplay} // with {@link SurfaceView} mCamera.setPreviewTexture(mPreview.getSurfaceTexture()); } catch (IOException e) { Log.e(TAG, "Surface texture is unavailable or unsuitable" + e.getMessage()); return false; } // END_INCLUDE (configure_preview) // BEGIN_INCLUDE (configure_media_recorder) mMediaRecorder = new MediaRecorder(); // Step 1: Unlock and set camera to MediaRecorder mCamera.unlock(); mMediaRecorder.setCamera(mCamera); // Step 2: Set sources mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) mMediaRecorder.setProfile(profile); // Step 4: Set output file mMediaRecorder.setOutputFile(CameraHelper.getOutputMediaFile( CameraHelper.MEDIA_TYPE_VIDEO).toString()); mMediaRecorder.setOrientationHint(90); // END_INCLUDE (configure_media_recorder) MediaScannerConnection.scanFile(this, new String[] { CameraHelper.getOutputMediaFile( CameraHelper.MEDIA_TYPE_VIDEO).getPath() }, new String[] { "video/mp4" }, null); // Step 5: Prepare configured MediaRecorder try { mMediaRecorder.prepare(); } catch (IllegalStateException e) { Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage()); releaseMediaRecorder(); return false; } catch (IOException e) { Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage()); releaseMediaRecorder(); return false; } return true; } 

Журналы:

 06-27 02:18:08.244 25734-25752/com.watchdawg.watchdawg E/MediaRecorder﹕ start failed: -22 06-27 02:18:08.253 25734-25752/com.watchdawg.watchdawg E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 Process: com.watchdawg.watchdawg, PID: 25734 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:304) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.RuntimeException: start failed. at android.media.MediaRecorder.start(Native Method) at com.watchdawg.watchdawg.RecordActivity$MediaPrepareTask.doInBackground(RecordActivity.java:276) at com.watchdawg.watchdawg.RecordActivity$MediaPrepareTask.doInBackground(RecordActivity.java:267) at android.os.AsyncTask$2.call(AsyncTask.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) 

Solutions Collecting From Web of "Сбой Android MediaRecorder"

Всякий раз, когда приложение удаляется из недавнего списка задач, процесс не будет полностью очищен, просто пользовательский интерфейс будет очищен. Таким образом, ответственность за очистку ресурса, связанного с вашей деятельностью или приложением, зависит от приложения. Следовательно, вам необходимо переопределить метод onTaskRemoved () в вашем сервисе (служба Android) и выполнить очистку (освобождение экземпляра mediaplayer и т. Д.).

Попробуйте вот так:

  mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setVideoFrameRate(24); mMediaRecorder.setVideoSize(720,480); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mPreview.setRotation(90); 

Вместо mMediaRecorder.setProfile (профиль); надеюсь, что это работает!