26

Я записываю видео с MediaRecorder. Мой код отлично работает на 2.3.3, но не работает 4.0.3.Ошибка MediaRecorder.stop(): -1007

Вопрос заключается в следующем: код mediaRecorder.stop() бросает RuntimeExeption

java.lang.RuntimeException: stop failed. 
    at android.media.MediaRecorder.stop(Native Method) 

с LogCat сообщение

04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007 

UPDATE

Я обнаружил, что MediaPlayer сообщает об (через MediaPlayer.OnErrorListener) почти сразу после запуска. Код ошибки - 100 (сбой медиа-сервера), дополнительный -1007.

UPDATE 2 Код для подготовки MediaRecorder

  c = Camera.open(); 

    ... 

    // Step 1: Unlock and set camera to MediaRecorder 
    camera.unlock(); 
    mediaRecorder.setCamera(camera); 

    // Step 2: Set sources 
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) 
    CamcorderProfile profile = CamcorderProfile 
      .get(CamcorderProfile.QUALITY_HIGH); 

    // manual set up! 

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 

    mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); 
    mediaRecorder.setVideoFrameRate(profile.videoFrameRate); 
    mediaRecorder.setVideoSize(profile.videoFrameWidth, 
      profile.videoFrameHeight); 

    mediaRecorder.setAudioChannels(profile.audioChannels); 
    mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate); 
    mediaRecorder.setAudioSamplingRate(profile.audioSampleRate); 

    mediaRecorder.setAudioEncoder(profile.audioCodec); 
    //mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
    mediaRecorder.setVideoEncoder(profile.videoCodec); 

    // mediaRecorder.setProfile(profile); 

    // Step 4: Set output file 
    mediaRecorder.setOutputFile("somefile.mp4"); 

    // Step 5: Set the preview output 
    mediaRecorder.setPreviewDisplay(preview.getHolder().getSurface()); 

    // Step 6: Prepare configured MediaRecorder 
    try { 
     mediaRecorder.prepare(); 
    } catch ... 
    { release mediaRecorder} 

я simplyCall mediaRecorder.start() обратите внимание, что мне нужно видео, чтобы быть закодирован в формате MP4. Этот код работает на Samsng Galaxy GIO (android 2.3.3) и не работает, как описано в Acer E305 (android 4.0.2)

Любые идеи? Спасибо.

+0

Я нашел похожую проблему, но это не было полезно: https://code.google.com/p/android/issues/detail?id=38107 – alekz

+0

Можете ли вы показать код как вы готовите объект MediaRecorder? –

+0

Некоторые фрагменты кода также могут быть полезны –

ответ

20

Решил его наконец. Проблема заключалась в настройке размера предварительного просмотра перед установкой фактического предварительного просмотра камеры. Размер предварительного просмотра ДОЛЖЕН быть равным выбранному размеру видео.

CamcorderProfile profile = [get required profile]; 

Camera.Parameters parameters = mCamera.getParameters(); 
parameters.setPreviewSize(profile.videoFrameWidth,profile.videoFrameHeight); 
mCamera.setParameters(parameters); 

mCamera.setPreviewDisplay([surface holder]); 
mCamera.startPreview(); 

... 

//configure MediaRecorder and call MediaRecorder.start() 
+1

Ваша легенда :), которая мне очень помогла. У меня была постоянная проблема, которая исправлена. На некоторых модельных телефонах у меня была проблема с прерывистой ситуацией. в частности, HTC Sensation, работающий на 4.x.x, не смог записать видео в 100% случаев без предварительной настройки размера предварительного просмотра на поверхности, хотя его ширина равна 1px. У меня были странные проблемы, когда он иногда записывал яркое зеленое полосатое видео или был совершенно неиграбельным, но только при разрешении 720x480 или выше. Используя 'setPreviewSize()', была исправлена ​​странная проблема. :) – wired00

+0

спасибо, это помогло мне !! но я получаю исключение nullpointer при выходе из своего приложения. '10 -11 22: 38: 47.609: E/SurfaceView (18569): исключение NullPointerException при обновлении окна. mSession = [email protected], mWindow = [email protected] 10-11 22: 38: 47.609: E/SurfaceView (18569): Неожиданное исключение NullPointerException. ' Не могли бы вы мне помочь. – user2376920

+0

Я использовал этот код некоторое время без каких-либо проблем, но поскольку я обновил свой Nexus 6 до Android 6.0, приложение случайно разбивается на: 'parameters.setPreviewSize ' –

14

Цитирование документацию метода "стоп" в MediaRecorder.java в 4.0.3:

Останавливает запись. Вызвать это после начала(). Как только запись остановлена, вам придется настроить ее снова, как если бы она только что была построена . Обратите внимание, что исключение RuntimeException намеренно добавляется к приложению, если не получено достоверных аудио/видеоданных при вызове stop(). Это происходит, если stop() вызывается сразу после start(). Неисправность позволяет приложению принять меры, соответствующие , очистить выходной файл (например, удалить выходной файл), так как выходной файл некорректно сконструирован, когда это произойдет.

И тот факт, что MediaPlayer сообщает об этом «медиа-сервере», по той же причине. Можете ли вы опубликовать остальную часть кода, чтобы узнать, есть ли заблуждение, которое может вызвать эту проблему?

+0

Спасибо за ваш ответ. Я уже знаю о причине исключения Exception. Но я все еще не могу понять, почему конфигурация MediaRecorder не работает на acerE350 (Android 4.0.3) и что означает ошибка «-1007». Что касается вашего вопроса - я могу опубликовать остальную часть своего кода, но он работает надежно на нескольких других телефонах ... Я проверил, что все методы вызывают в правильном порядке, и можно выполнить перезагрузку MEdiaRecorders ServerDied, но я просто хочу настроить MediaRenderer для создания видео MP4 с максимально возможным качеством. – alekz

+1

Есть ли шанс (даже если маленький), что вы запускаете и останавливаете рекордер слишком быстро? Сколько кадров (или секунд) вы пытаетесь записать? –

+0

Я так не думаю. Он работает на нескольких бюджетных телефонах. Код довольно стандартный. Что касается fps - я пробовал 30 (QUALITY_HIGH профиль) и 15. Оба терпят неудачу. – alekz

0

Таким образом, я обнаружил, что эта ошибка сообщается мне в эмуляторе Android для API 18 (после того, как запись работала нормально в более поздних версиях).

То, что я обнаружил, что если бы я назвал Camera.startPreview() Перед инициализации и начал запуск моих MediaRecorder экземпляра, я получаю журнал stop failed: -1007 при вызове MediaRecorder.stop, но если бы я назвал Camera.stopPreview() Перед инициализацией моего MediaRecorder видео будет записывать в порядке.

Я надеюсь, что это помогает

+0

https: // stackoverflow.com/вопросы/47996933/mediarecorder-keep-freezing-in-recording-can not-get-it-to-work. Это мой код, у меня такая проблема, так где я ошибаюсь? – iBEK

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