J'enregistre une vidéo avec MediaRecorder. Mon code fonctionne bien sur 2.3.3 mais échoue sur 4.0.3.
Le problème est le suivant: le code mediaRecorder.stop () lève le RuntimeExeption
Java.lang.RuntimeException: stop failed.
at Android.media.MediaRecorder.stop(Native Method)
avec message LogCat
04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007
METTRE À JOUR
J'ai constaté que MediaPlayer signalait une erreur (via MediaPlayer.OnErrorListener) presque immédiatement après le début. Le code d'erreur est 100 (le serveur de médias est mort), extra -1007.
UPDATE 2 Code pour préparer le 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}
ensuite, veuillez noter que j'ai besoin que la vidéo soit encodée au format MP4 . Ce code fonctionne sur Samsng Galaxy GIO (Android 2.3.3) et échoue comme décrit sur Acer E305 (Android 4.0.2)
Des idées? Merci.
Enfin résolu… .. Le problème était de définir la taille de l'aperçu avant de définir l'aperçu réel de la caméra. La taille de l'aperçuDOITêtre égale à la taille de la vidéo sélectionnée.
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()
Citant la documentation de la méthode "stop" dans MediaRecorder.Java dans 4.0.3:
Arrête l'enregistrement. Appelez-le après start (). Une fois que l'enregistrement est arrêté, vous devrez le configurer à nouveau comme si cela venait juste d'être construit. Notez qu'une exception RuntimeException est intentionnellement renvoyée à l'application, si aucune donnée audio/vidéo valide n'a été reçue lorsque stop () est appelé. Cela se produit si stop () est appelé immédiatement après début(). L'échec laisse l'application agir en conséquence pour nettoie le fichier de sortie (supprimez le fichier de sortie, par exemple), car le fichier de sortie n'est pas correctement construit lorsque cela se produit.
Et le fait que MediaPlayer rapporte ce "serveur multimédia est mort" est dû à la même raison. Pouvez-vous publier le reste de votre code pour voir s'il y a une idée fausse qui pourrait causer ce problème?
J'ai donc trouvé cette erreur signalée pour moi sur l'émulateur Android pour API 18 (après que l'enregistrement fonctionnait correctement sur les versions ultérieures).
Ce que j'ai trouvé, c'est que si j'avais appelé Camera.startPreview()
avant d'initialiser et de démarrer mon instance MediaRecorder
, j'obtiendrais le journal stop failed: -1007
en appelant MediaRecorder.stop
, mais si j'avais appelé Camera.stopPreview()
avant d'initialiser mon MediaRecorder
, l'enregistrement vidéo serait parfait.
J'espère que ça aide