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 ...
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
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. –
Dopo molte ricerche il tuo post ha reso la mia giornata. Mettere setVideoSize prima setVideoEncoder e setAudioEncoder ha fatto il trucco. Grazie – gtsouk