2014-02-07 11 views
5

Ich habe den folgenden Code:setOutputFormat in einem ungültigen Zustand genannt: 4 (wo und warum)

Log.i("xx","A"); 
       media_recorder = new MediaRecorder(); 
Log.i("xx","B"); 
       media_recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
Log.i("xx","C"); 
       media_recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
Log.i("xx","D"); 
       media_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
Log.i("xx","E"); 
       media_recorder.setVideoSize(320, 240); 
Log.i("xx","F"); 
       media_recorder.setVideoFrameRate(15); 
Log.i("xx","G"); 
       CamcorderProfile profile = CamcorderProfile.get(CameraInfo.CAMERA_FACING_FRONT,CamcorderProfile.QUALITY_LOW); 
Log.i("xx","H"); 
       media_recorder.setProfile(profile); 
Log.i("xx","I"); 
       media_recorder.setOutputFile(fname); 

Wenn der Code ausgeführt wird, sehe ich die folgenden in meinen Logs;

02-07 16:12:47.628: I/xx(15436): A 
02-07 16:12:47.628: I/xx(15436): B 
02-07 16:12:47.638: I/xx(15436): C 
02-07 16:12:47.638: I/xx(15436): D 
02-07 16:12:47.638: I/xx(15436): E 
02-07 16:12:47.638: I/xx(15436): F 
02-07 16:12:47.638: I/xx(15436): G 
02-07 16:12:47.638: I/xx(15436): H 
02-07 16:12:47.638: E/MediaRecorder(15436): setOutputFormat called in an invalid state: 4 

Das hat mich verwirrt, weil der Aufruf von setOutputFormat zwischen „C“ und „D“, aber der Bericht des Fehlers vorgenommen wurde, erscheint sofort nach dem H zu sein (nie „I“ zu erreichen). So, jetzt weiß ich nicht, was den Fehler verursacht, und ich bin verwirrt darüber, wo der Fehler auftritt.

EDIT: Ich trat nur durch den Code im Debugger - und sicher genug der Fehler auftritt, während der Anruf setProfile (Profil) ... so scheint es, dass die zu setOutputFormat gemacht Anruf (zwischen „C“ & "D") muss in Ordnung gewesen sein, aber dann muss setProfile selbst einen zweiten Aufruf von setOutputFormat machen, was dann fehlschlägt ... ist das, was los ist?

EDIT: Und was bedeutet ungültiger Zustand 4 eigentlich? Gibt es irgendwo eine Liste, die dir die Bedeutung jeder möglichen ungültigen Zustandsnummer 1,2,3,4 ... etc verrät?

Antwort

7

Hier Quellcode setProfile Methode:

public void setProfile(CamcorderProfile profile) { 
    setOutputFormat(profile.fileFormat); 
    setVideoFrameRate(profile.videoFrameRate); 
    setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); 
    setVideoEncodingBitRate(profile.videoBitRate); 
    setVideoEncoder(profile.videoCodec); 
    if (profile.quality >= CamcorderProfile.QUALITY_TIME_LAPSE_LOW && 
     profile.quality <= CamcorderProfile.QUALITY_TIME_LAPSE_QVGA) { 
    // Nothing needs to be done. Call to setCaptureRate() enables 
    // time lapse video recording. 
    } else { 
    setAudioEncodingBitRate(profile.audioBitRate); 
    setAudioChannels(profile.audioChannels); 
    setAudioSamplingRate(profile.audioSampleRate); 
    setAudioEncoder(profile.audioCodec); 
    } 
} 

Z.B. Er setzt outputFormat, videoSize, encoder und frameRate auf Werte aus dem Profil. Also Ihr Code:

Log.i("xx","C"); 
media_recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
Log.i("xx","D"); 
media_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
Log.i("xx","E"); 
media_recorder.setVideoSize(320, 240); 
Log.i("xx","F"); 
media_recorder.setVideoFrameRate(15); 

ist zumindest nutzlos, und vielleicht während dieser Anrufe ändert es den Zustand. Versuche es ohne es.

2

Es passiert, weil Sie Werte in einem MediaRecorder nicht ändern können, ohne reset() aufzurufen, also müssen Sie alles auf dem MediaRecorder selbst einstellen (in der Tat müssen Sie dies vor API Level 8, Android 2.2 tun).

Alternativ können Sie ein benutzerdefiniertes CamcorderProfil erstellen, das z. was Sie wollten, da die Änderungen vornehmen und dieses Profil auf der MediaRecorder, wie diese ein:

// establish the media recorder 
    MediaRecorder media_recorder = new MediaRecorder(); 
    media_recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    media_recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    // Customise your profile based on a pre-existing profile 
    CamcorderProfile profile = CamcorderProfile.get(CameraInfo.CAMERA_FACING_FRONT,CamcorderProfile.QUALITY_LOW); 
    profile.fileFormat = MediaRecorder.OutputFormat.MPEG_4; 
    profile.videoCodec = MediaRecorder.VideoEncoder.MPEG_4_SP; 
    profile.videoFrameHeight = 240; 
    profile.videoFrameWidth = 320; 
    profile.videoBitRate = 15; 

    // Apply to MediaRecorder 
    media_recorder.setProfile(profile); 
3

In Ihrem obigen Code media_recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) zweimal aufgerufen wird. 1. Vorkommen, das von Ihnen in Ihrem Code zwischen Log.i("xx","C"); & Log.i("xx","D"); und dem zweiten Auftreten aufgerufen wird, das intern in MediaRecorder durch Ihre media_recorder.setProfile(profile); Methode, also zwischen Log.i("xx","H"); & Log.i("xx","I"); aufgerufen wird.

Da MediaRecorder Objekt des Lebenszyklus wie unten folgen sollte: enter image description here

Siehe setProfile() -Methode in MediaRecoder Klasse click here & wieder Ihren Code zu vergleichen.

Verwandte Themen