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
- infilare un FileInputStream che legge dal FileDescriptor del video destinazione
- chiamata MediaRecoder.setOutputFile sul FD di un socket 'mittente'. questo socket si connette a un LocalSocketServer , la cui destinazione è un socket 'ricevitore'.
- aprire un socket al mio server e dando setOutputFile sua FD
purtroppo entrambi i tentativi sono falliti.
- registro Solo 24 byte ogni volta che chiamo FileInputStream.available(), e il numero effettivo di byte solo dopo chiamo Recorder.stop()
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 (...) ...
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
- salva correttamente un video di incorrotto a SD
- opere se uso setOutputFile (pathtofile), invece. le prese funzionano anche quando ho eseguito
sender.getOutputStream().write(message.getBytes());
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
1) e 2) sono due esempi separati – ebaum
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