2011-01-09 19 views
6

Sto cercando di ottenere un flusso video dal punto A (telefono Android 2.1) al punto B (il mio server) in tempo reale. Come lo farei? Si riporta di seguito sono i miei tentativi (un po 'lungo, ma concise!)in streaming un file MediaRecorder durante la registrazione


L'obiettivo è quello di ottenere un video lungo un'ora registrate sul telefono al server senza mettere in pausa/fermare il flusso. un ritardo di diversi minuti non è un problema. Ho provato tre approcci

  1. infilare un FileInputStream che legge dal FileDescriptor del video destinazione
  2. chiamata MediaRecoder.setOutputFile sul FD di un socket 'mittente'. questo socket si connette a un LocalSocketServer , la cui destinazione è un socket 'ricevitore'.
  3. aprire un socket al mio server e dando setOutputFile sua FD

purtroppo entrambi i tentativi sono falliti.

  1. registro Solo 24 byte ogni volta che chiamo FileInputStream.available(), e il numero effettivo di byte solo dopo chiamo Recorder.stop()
  2. mi da questo ben inutile stacktrace

    ERRORE/AndroidRuntime (18532): causato da: java.lang.RuntimeException: avvio non riuscito. ERRORE/AndroidRuntime (18532): a android.media.MediaRecorder.start (metodo natale) ERRORE/AndroidRuntime (18532): a com.example.demovideo.DemoVideo.initializeCamera (...) ...

  3. stesso errore 2

frammenti di codice (parti omesse)

1)

fileOut = new FileOutputStream(pathToFile); 
... 
recorder.setOutputFile(fileOut.getFD()); 
recorder.prepare() 
recorder.start() 

// in an Async Thread 
fileIn = FileInputStream(fileOut.getFD); 
while (recording) { 
    fos.flush(); 
    Log.w("---", "bytesAvailable: " + fileIn.available()); //always returns 24 
    Thread.sleep(1000); 
} 

2)

// in a Thread 
server = new LocalServerSocket(SOCKET_ADDRESS); 
    while (true){ 
     receiver = server.accept(); 
     if (receiver != null){ 
     InputStream input = receiver.getInputStream(); 
      ... // processing would go here 
    } } 

sender = new LocalSocket(); 
sender.connect(new LocalSocketAddress(SOCKET_ADDRESS)); 
recorder.setOutputFile(sender.getFileDescriptor()); 
... 
recorder.prepare(); 
recorder.start(); // <- error 
  1. salva correttamente un video di incorrotto a SD
  2. opere se uso setOutputFile (pathtofile), invece. le prese funzionano anche quando ho eseguito sender.getOutputStream().write(message.getBytes());
+0

Sto cercando di implementare la stessa funzione. Ma non ho il tuo metodo. Si imposta recorder.setOutputFile due volte: una volta in un file, l'altra in un socket. Penso che il registratore funzionerà con il nuovo ID file ogni volta che cambierai, piuttosto che con più ID file. – user1914692

+0

1) e 2) sono due esempi separati – ebaum

+0

Se sono separati, quindi come si implementano le due attività contemporaneamente? In realtà se fai le due attività separatamente, dovrebbe essere un problema di difficoltà. Per l'attività di streaming, vedi Spydroid-ipcamera in code.google – user1914692

risposta

2
  1. ho creato un video mobile-to-server di streaming app con questo approccio e ha funzionato. Quindi questo dovrebbe essere l'approccio giusto. Più tardi, quando non facevo più parte del progetto, ho scoperto che questo approccio non funzionava con alcuni telefoni più recenti, in particolare Samsung Galaxy S. Il problema era che questi telefoni scaricavano i dati dei video con parsimonia, solo una volta al minuto, forse. Che telefono stai usando per testare questo?

  2. & 3. MediaRecorder è un wrapper attorno a una libreria nativa. Presumo che questa libreria voglia un file concreto da scrivere su non una pipe. Su un file di livello file system le pipe & hanno lo stesso aspetto, ma non è possibile avere accesso casuale a una pipe (ricerca).

+0

Sto usando la ... galaxy S. Non l'ho visto arrivare, grazie per la cattura! Se dovessi impostare il socket del ricevitore in output su un file, 2 o 3 funzionerebbe? – ebaum

+0

Ciao, sto anche cercando di fare la stessa cosa ... Hai per caso provato su un telefono Huawei IDEOS o HTC G1? Se no, posso accedere all'APK e testarlo? Grazie. – Rob

+0

Ha funzionato su G1 in quel momento (circa 1,5 anni fa), non so sull'altro telefono. L'apk è su www.livecliq.net. Non so sullo stato attuale del progetto. –

Problemi correlati