2013-07-23 31 views
11

Di seguito si riporta la struttura del mio codice di lavoro per registrare video e audio:Utilizzando MediaRecorder Android

Domande: 1) Perché la CamcorderProfile necessario? setProfile(...) sembra impostare le dimensioni su QUALITY_HIGH qualunque, ma successivamente imposto le dimensioni che voglio con setVideoSize(...), che sovrascrive questo. Tuttavia, quando rimuovo le due linee CamcorderProfile, l'app si arresta in modo anomalo a setVideoSize(...) con LogCat E/MediaRecorder(19526): setVideoSize called in an invalid state: 2.

2) Come si registra l'audio? La documentazione afferma che se non viene chiamato setAudioSource(...), non ci sarà traccia audio. Tuttavia, quando rimuovo la linea, l'app si arresta in modo anomalo a setProfile(...) con LogCat E/MediaRecorder(19946): try to set the audio encoder without setting the audio source first.

3) Se rimuovo entrambe le linee CamcorderProfile e la riga setAudioSource(...), si blocca come in 1).

4) ho anche provato ad aggiungere la riga

recorder.setOutputFormat(OutputFormat.DEFAULT); 

invece delle linee CamcorderProfile. Ma ora si blocca a perpare(). Se setAudioSource(...) si chiama LogCat è: E/MediaRecorder(20737): audio source is set, but audio encoder is not set se non è chiamato il LogCat è: E/MediaRecorder(20544): video source is set, but video encoder is not set

ho guardato allover internet e non riesco a trovare un buon esempio del modo corretto di impostare la MediaRecorder. Here implica dopo l'API 8 si dovrebbe usare la classe CamcorderProfile, ma mi sembra che stia causando problemi.

Qualsiasi aiuto sarebbe fantastico! Grazie!

codice (che funziona quando viene eseguito in quanto è al di sotto):

recorder = new MediaRecorder(); 
recorder.setCamera(<<camera>>); 
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
recorder.setProfile(profile); 

recorder.setOutputFile(<<Path String>>); 
recorder.setVideoSize(<<Width>>, <<Height>>); 

recorder.setPreviewDisplay(<<Surface>>); 

recorder.setOrientationHint(0); 
recorder.setMaxDuration(10000); 
recorder.setOnInfoListener(this); 

try 
{ 
    recorder.prepare(); 
    recorder.start(); 
} catch ... 

risposta

15

Non ho molta esperienza con MediaRecorder ma stavo leggendo alcuni argomenti correlati e cercherò di rispondere alle vostre domande:

1, 3 e 4) CamcorderProfile imposta più della semplice risoluzione, imposta anche le cose come formato di output e codificatori (sia per audio che per video). Si sta verificando l'errore perché probabilmente è necessario utilizzare setOutputFormat prima di chiamare setVideoSize e dopo si deve chiamare setVideoEncoder e setAudioEncoder se non si desidera utilizzare CamcorderProfile. [Secondo questo answer]

2) Anche in questo caso, CamcorderProfile imposta anche proprietà audio (come codec, bitrate, SampleRate, ...) quindi è necessario impostare una sorgente audio prima di chiamare, ecco perché l'app si è bloccata. Se non si desidera registrare l'audio provare il codice successivo: (non ho la prova in modo che io in realtà non so se funziona, ma sono abbastanza sicuro che lo fa)

recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setVideoSize(WIDTH, HEIGHT); 
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
recorder.setOutputFile(PATH); 
recorder.setPreviewDisplay(SURFACE); 

recorder.prepare(); 
recorder.start(); 

essere anche consapevole che se non si desidera utilizzare CamcorderProfile (ovvero che si desidera registrare solo audio o video) potrebbe essere necessario impostare parametri aggiuntivi per garantire la qualità desiderata. Date un'occhiata al seguente codice di esempio:

recorder = new MediaRecorder(); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 

// Following code does the same as getting a CamcorderProfile (but customizable) 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
// Video Settings 
recorder.setVideoSize(WIDTH, HEIGHT); 
recorder.setVideoFrameRate(FRAME_RATE); 
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
recorder.setVideoEncodingBitRate(VIDEO_BITRATE); 
// Audio Settings 
recorder.setAudioChannels(AUDIO_CHANNELS); 
recorder.setAudioSamplingRate(SAMPLE_RATE); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
recorder.setAudioEncodingBitRate(AUDIO_BITRATE); 

// Customizable Settings such as: 
// recorder.setOutputFile(PATH); 
// recorder.setPreviewDisplay(SURFACE); 
// etc... 

// Prepare and use the MediaRecorder 
recorder.prepare(); 
recorder.start(); 
... 
recorder.stop(); 
recorder.reset(); 
recorder.release(); 

Spero che questo ti aiuti.

+1

Si è corretto, così come ho postato questo ho trovato il codice per la funzione 'setProfile()'. Chiama sempre 'setAudioEncoder()' quindi se non si imposta la sorgente audio si bloccherà. La risposta è copiare questa funzione, in questo modo puoi ancora usare le impostazioni incorporate in 'CamcorderProfile', ma anche scegliere quali impostazioni vuoi impostare (es. Audio). Grazie – jacobianism

+0

Sì, se vuoi usare Camcorder per ottenere solo video puoi farlo anche tu. In questo modo è possibile ottenere i valori ottimali disponibili per qualsiasi dispositivo senza doverli codificare. –

+1

Dopo molte ricerche il tuo post ha reso la mia giornata. Mettere setVideoSize prima setVideoEncoder e setAudioEncoder ha fatto il trucco. Grazie – gtsouk

Problemi correlati