Comment utiliser MediaRecorder pour enregistrer une vidéo sans causer d'erreur de segmentation?
-
10-07-2019 - |
Question
J'essaie d'utiliser android.media.MediaRecorder pour enregistrer de la vidéo, et quoi que je fasse des erreurs de segmentation d'exécution Android lorsque j'appelle prepare (). Voici un exemple:
public void onCreate(Bundle savedInstanceState)
{
Log.i("video test", "making recorder");
MediaRecorder recorder = new MediaRecorder();
contentResolver = getContentResolver();
try {
super.onCreate(savedInstanceState);
Log.i("video test", "--------------START----------------");
SurfaceView target_view = new SurfaceView(this);
Log.i("video test", "making surface");
Surface target = target_view.getHolder().getSurface();
Log.i("video test", target.toString());
Log.i("video test", "new recorder");
recorder = new MediaRecorder();
Log.i("video test", "set display");
recorder.setPreviewDisplay(target);
Log.i("video test", "pushing surface");
setContentView(target_view);
Log.i("video test", "set audio source");
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Log.i("video test", "set video source");
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
Log.i("video test", "set output format");
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
Log.i("video test", "set audio encoder");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Log.i("video test", "set video encoder");
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
Log.i("video test", "set max duration");
recorder.setMaxDuration(3600);
Log.i("video test", "set on info listener");
recorder.setOnInfoListener(new listener());
Log.i("video test", "set video size");
recorder.setVideoSize(320, 240);
Log.i("video test", "set video frame rate");
recorder.setVideoFrameRate(15);
Log.i("video test", "set output file");
recorder.setOutputFile(get_path(this, "foo.3gp"));
Log.i("video test", "prepare");
recorder.prepare();
Log.i("video test", "start");
recorder.start();
Log.i("video test", "sleep");
Thread.sleep(3600);
Log.i("video test", "stop");
recorder.stop();
Log.i("video test", "release");
recorder.release();
Log.i("video test", "-----------------SUCCESS------------------");
finish();
} catch (Exception e) {
Log.i("video test", e.toString());
recorder.reset();
recorder.release();
Log.i("video tets", "-------------------FAIL-------------------");
finish();
}
}
public static String get_path (Context context, String fname) {
String path = context.getFileStreamPath("foo").getParentFile().getAbsolutePath();
String res = path+"/"+fname;
Log.i("video test", "path: "+res);
return res;
}
class listener implements MediaRecorder.OnInfoListener {
public void onInfo(MediaRecorder recorder, int what, int extra) {
Log.i("video test", "Video Info: "+what+", "+extra);
}
}
La solution
Le problème semble être lié au minutage de la machine d'état pour l'appareil photo.
La caméra peut avoir besoin de plusieurs centaines de millisecondes pour se configurer avant que la préparation ne soit appelée.
Voir le post suivant:
http://code.google.com/p/android / issues / detail? id = 5050
Autres conseils
recorder.setVideoSize(176, 144);
recorder.setVideoFrameRate(20);
recorder.setAudioChannels(1);
recorder.setPreviewDisplay( mHolder.getSurface());//<- I believe this helped
cela m'a aidé. Rechercher dans logcat lors du débogage
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow