MediaRecorder.stop () stop fallido: -1007


Estoy grabando video con MediaRecorder. Mi código funciona bien en 2.3.3 pero falla en 4.0.3.

El problema es el siguiente: el código MediaRecorder.stop() lanza la RuntimeExeption

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

Con mensaje LogCat

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

ACTUALIZAR

He encontrado, que MediaPlayer informa de un error (a través de MediaPlayer.OnErrorListener) casi inmediatamente después del inicio. El código de error es 100 (servidor de medios muerto), extra -1007.

ACTUALIZACIÓN 2 Código para preparar el 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}

Entonces simplyCall MediaRecorder.empezar() tenga en cuenta que necesito que el video se codifique en formato mp4. Este código funciona en Samsng Galaxy GIO (android 2.3.3) y falla como se describe en Acer E305 (android 4.0.2)

¿Alguna idea? Gracias.

Author: Alex, 2013-04-05

3 answers

Resuelto por fin. El problema fue establecer el tamaño de vista previa antes de establecer la vista previa real para la cámara. El tamaño de vista previa DEBE ser igual al tamaño del vídeo seleccionado.

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()
 22
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-14 12:28:53

Citando la documentación del método "stop" en MediaRecorder.java en 4.0.3:

Detiene la grabación. Llame a esto después de start (). Una vez que se detiene la grabación, tendrás que configurarlo de nuevo como si acabara de ser construir. Tenga en cuenta que una RuntimeException se lanza intencionalmente a la aplicación, si no se han recibido datos de audio/video válidos cuando se llama stop (). Esto sucede si se llama a stop() inmediatamente después empezar(). El fallo permite que la aplicación tome medidas en consecuencia limpiar el archivo de salida (eliminar el archivo de salida, por ejemplo), ya que el archivo de salida no se construye correctamente cuando esto sucede.

Y el hecho de que MediaPlayer esté reportando este "servidor de medios muerto" se debe a la misma razón. ¿Puedes publicar el resto de tu código para ver si hay algún error que pueda causar este problema?

 15
Author: Jose L Ugia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-13 10:02:58

Así que encontré este error que se informa para mí en el emulador de Android para API 18 (después de la grabación estaba funcionando bien en versiones posteriores).

Lo que encontré es que si hubiera llamado Camera.startPreview() antes de inicializar y comenzar a iniciar mi instancia MediaRecorder, obtendría el registro stop failed: -1007 al llamar MediaRecorder.stop, pero si llamé Camera.stopPreview() antes de inicializar mi MediaRecorder el video grabaría bien.

Espero que esto ayude

 0
Author: kassim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-22 02:27:38