Comment utiliser MediaRecorder pour enregistrer une vidéo sans causer d'erreur de segmentation?

StackOverflow https://stackoverflow.com/questions/1822983

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);
    }
}
Était-ce utile?

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
scroll top