Como faço para usar MediaRecorder para gravar vídeo sem causar uma falha de segmentação?

votos
0

Eu estou tentando usar android.media.MediaRecorder para gravar o vídeo, e não importa o que eu faço as falhas de segmentação de tempo de execução android quando eu chamo prepare (). Aqui está um exemplo:

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);
    }
}
Publicado 30/11/2009 em 23:51
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

A questão parece estar relacionado ao tempo da máquina estatal para a câmera.

A câmara pode precisar de centenas de milissegundos para 'set up' antes da preparação é chamado.

Consulte o seguinte post:

http://code.google.com/p/android/issues/detail?id=5050

Respondeu 21/07/2010 em 15:21
fonte usuário

votos
1
recorder.setVideoSize(176, 144); 
recorder.setVideoFrameRate(20); 
recorder.setAudioChannels(1); 
recorder.setPreviewDisplay( mHolder.getSurface());//<- I believe this helped

isso ajudou para mim. Olhe em logcat durante depuração

Respondeu 14/04/2011 em 11:26
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more