Intereting Posts
Ошибка в этом XML: ошибка синтаксического анализа XML: несвязанный префикс Android HttpClient и HTTPS Как я могу манипулировать стеком активности Android? «Невозможно выполнить это действие в незапечатанном экземпляре» Исключение java.lang.IllegalStateException Исключение для Android Roboguice Бинарная строка XML-файла # 39: ошибка раздувания класса com.android.internal.widget.ActionBarView Почему получение Google Directions для Android с использованием данных KML больше не работает? Невозможно использовать фрагменты с пакетом совместимости с Android Android Studio IDE с частным jre / jdk? OSX Определение пользовательских атрибутов Исключение из сериализации массива с помощью proguard android Как получить максимальную ширину и высоту устройства в android Обработка сигналов unix в Android Android: включить внешний баннер в сборку (без Eclipse) Как добавить заголовок и объект предпочтения в PreferenceActivity, не используя XML-файл, а Java?

Android MediaRecorder разбился после заданного профиля

У меня проблема с сохранением видео на SD-карте с помощью MediaRecorder на Android.

Мой код работает до тех пор, пока я не дойду до линии, которая установила бы профиль высокого качества.

Это мой код:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.activity_sample_testing); // Show the Up button in the action bar. //setupActionBar(); overridePendingTransition(0, 0); SurfaceView cameraView = (SurfaceView)findViewById(R.id.videoView1); holder = cameraView.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); intentTestResults = new Intent(this, TestResultsAct.class); TestPB = (ProgressBar) findViewById(R.id.ProgressBarTest); new Thread(new Runnable() { @Override public void run() { while(mProgressStatus < 100){ if(mProgressStatus == 1) record(); if(mProgressStatus == 35) record(); mProgressStatus += 1; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } mHandler.post(new Runnable() { @Override public void run() { TestPB.setProgress(mProgressStatus); } }); } } }).start(); // } 

в то время как

  private void initRecorder() { camera.unlock(); recorder.setCamera(camera); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); CamcorderProfile cpHigh = CamcorderProfile .get(CamcorderProfile.QUALITY_HIGH); recorder.setProfile(cpHigh); recorder.setOutputFile(Environment.getExternalStorageDirectory() + "/DCIM/Frames/videocapture_example.mp4"); recorder.setMaxDuration(50000); // 50 seconds recorder.setMaxFileSize(300000000); // Approximately 5 megabytes } private void prepareRecorder() { recorder.setPreviewDisplay(holder.getSurface()); try { recorder.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); finish(); } catch (IOException e) { e.printStackTrace(); finish(); } } void record() { if (recording) { recorder.stop(); recording = false; camera.lock(); parameters.setFlashMode(Parameters.FLASH_MODE_OFF); camera.setParameters(parameters); camera.unlock(); recorder.release(); //finish(); } else { recording = true; initRecorder(); prepareRecorder(); recorder.start(); } } 

Моя проблема возникла после этой строки: recorder.setProfile (cpHigh);

Это логарифм:

 12-26 10:37:43.670: E/MediaRecorder(6046): try to set the audio encoder without setting the audio source first 12-26 10:38:35.150: W/dalvikvm(6046): threadid=11: thread exiting with uncaught exception (group=0x40fee2a0) 12-26 10:38:37.065: E/AndroidRuntime(6046): FATAL EXCEPTION: Thread-794 12-26 10:38:37.065: E/AndroidRuntime(6046): java.lang.IllegalStateException 12-26 10:38:37.065: E/AndroidRuntime(6046): at android.media.MediaRecorder.setAudioEncoder(Native Method) 12-26 10:38:37.065: E/AndroidRuntime(6046): at android.media.MediaRecorder.setProfile(MediaRecorder.java:370) 12-26 10:38:37.065: E/AndroidRuntime(6046): at com.example.homedevice.SampleTestingAct.initRecorder(SampleTestingAct.java:124) 12-26 10:38:37.065: E/AndroidRuntime(6046): at com.example.homedevice.SampleTestingAct.record(SampleTestingAct.java:155) 12-26 10:38:37.065: E/AndroidRuntime(6046): at com.example.homedevice.SampleTestingAct$2.run(SampleTestingAct.java:90) 12-26 10:38:37.065: E/AndroidRuntime(6046): at java.lang.Thread.run(Thread.java:856) 12-26 10:38:47.555: E/MediaRecorder(6046): stop called in an invalid state: 4 

Исключением является: java.lang.IllegalStateException

Что я делаю неправильно?

EDIT1 (со звуковым разрешением):

 private void initRecorder() { camera.unlock(); recorder.setCamera(camera); recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //recorder.setVideoSize(1920, 1080); //recorder.setVideoFrameRate(30); CamcorderProfile cpHigh = CamcorderProfile .get(CamcorderProfile.QUALITY_HIGH); recorder.setProfile(cpHigh); recorder.setOutputFile(Environment.getExternalStorageDirectory() + "/DCIM/Frames/videocapture_example.mp4"); recorder.setMaxDuration(50000); // 50 seconds recorder.setMaxFileSize(300000000); // Approximately 5 megabytes } 

Edit2 (logcat): это лог-код

  12-26 11:32:43.170: E/AndroidRuntime(18552): FATAL EXCEPTION: Thread-1016 12-26 11:32:43.170: E/AndroidRuntime(18552): java.lang.IllegalStateException 12-26 11:32:43.170: E/AndroidRuntime(18552): at android.media.MediaRecorder.setOutputFormat(Native Method) 12-26 11:32:43.170: E/AndroidRuntime(18552): at android.media.MediaRecorder.setProfile(MediaRecorder.java:357) 12-26 11:32:43.170: E/AndroidRuntime(18552): at com.example.homedevice.SampleTestingAct.initRecorder(SampleTestingAct.java:127) 12-26 11:32:43.170: E/AndroidRuntime(18552): at com.example.homedevice.SampleTestingAct.record(SampleTestingAct.java:158) 12-26 11:32:43.170: E/AndroidRuntime(18552): at com.example.homedevice.SampleTestingAct$2.run(SampleTestingAct.java:90) 12-26 11:32:43.170: E/AndroidRuntime(18552): at java.lang.Thread.run(Thread.java:856) setOutputFormat called in an invalid state: 4 threadid=11: thread exiting with uncaught exception (group=0x40fee2a0). 

SetProfile ().

Он всегда вызывает setAudioEncoder (), поэтому, если вы не установите источник звука, он сработает.

Попробуйте включить это в свой код:

 recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 

Объяснение:

CamcorderProfile также устанавливает свойства звука (такие как Codec, BitRate, SampleRate, …), поэтому вам нужно установить источник звука перед его вызовом, поэтому приложение разбилось. Если вы не хотите записывать аудио, попробуйте следующий код:

 recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setVideoSize(WIDTH, HEIGHT); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); recorder.setOutputFile(PATH); recorder.setPreviewDisplay(SURFACE); recorder.prepare(); recorder.start();