2013-04-23 15 views
6

Attualmente sto usando onPreviewCallback in modo da poter acquisire i fotogrammi dalla fotocamera quando sono in anteprima e trasmetterli in streaming tramite http.Mantenimento della richiamata dell'anteprima durante la registrazione di un video?

Che funziona, ma poi comando un comando per avviare la registrazione e, a quanto pare, non ho più un callback di anteprima.

Quindi, come mantenere la richiamata di anteprima in modo che sia possibile inviare i frame dalla superficie al mio server E registrare il video sul dispositivo?

risposta

5

Non ho lavorato per molto tempo con Android Camera. Tuttavia, come mi ricordo

1) onPreviewCallback non viene chiamato durante la registrazione

E 'citato in paio di domande:

Camera onPreviewFrame not called How to show real time filtered camera preview while recording videos?

2) ho visto che è stato gestito in SipDroid e in una coppia di altri client SIP Android in questo modo (questo era un 1-2 anni fa, quindi questo metodo potrebbe essere superato):

  • Un tubo è stato creato
  • Ricezione presa del tubo era avvolto in FileDescriptor e passato a MediaRecorder setOutputFile
  • Invio presa del tubo era costantemente leggere in un thread.
  • In questo modo è possibile ricevere un contenuto che viene scritto in un file
  • Ora, il problema su come gestire il contenuto (poiché è H.263 o H.264 codificato e potrebbe essere mixato con il suono, se si registra video con il suono).
  • Ci sono stati alcuni algoritmi euristiche che analizzati i contenuti (tuttavia, è rompicoglioni)

3) È possibile utilizzare onPreviewFrame + Start AudioRecorder e codificare da soli (utilizzando ffmpeg o qualcosa di simile) per mp4 file. In questo modo non è necessario avviare la registrazione MediaRecorder.

1

Una volta ho ottenuto la fotocamera e MediaRecorder per avviare e interrompere la registrazione senza crash (non è stato facile) Ho ancora avuto un problema come hai descritto, in cui la richiamata di anteprima avrebbe smesso di essere chiamata.

La correzione che ho trovato è stata l'aggiunta di una chiamata a setPreviewCallback dopo mediaRecorder.start() e un altro dopo mediaRecorder.stop(). Non sono sicuro se questo è corretto, ma ha funzionato sul Razr M che sto testando.

2

È possibile chiamare questi metodi dopo il vostro supporto recorder.start() viene chiamato come segue:

camera.reconnect(); 
camera.setPreviewCallback(); 
surfaceview.getHolder().addCallback(); 

Le ragioni:

  1. Dopo camera.unlock() viene chiamato, un altro processo (qui è il processo di registrazione del media) può utilizzare la fotocamera; quando il processo è terminato, è necessario riconnettersi alla videocamera, che riacquisterà il blocco e consentirà di continuare a utilizzare la fotocamera.
  2. E quindi registrare nuovamente la richiamata dei dati del frame della vista surfaceview dopo che la telecamera è stata ricollegata, poiché il suo stato potrebbe essere cambiato dopo essere stato ricollegato.

Sono sempre stato lo stesso problema del tuo nella mia applicazione e l'ho risolto con questo. Spero che possa risolvere i tuoi problemi!

Problemi correlati