Ich versuche, einen Video-Stream von Punkt A (2.1 Android-Handy) zu Punkt B (mein Server) in Echtzeit zu bekommen. Wie würde ich es tun? unten detailliert sind meine Versuche (ein wenig lang, aber prägnante!)eine MediaRecorder-Datei während der Aufnahme streamen
Das Ziel ist es, eine Stunde lange Video mit dem Telefon auf dem Server ohne Pause/Anhalten des Stroms aufgezeichnet zu bekommen. eine Verzögerung von bis zu mehreren Minuten ist kein Problem. Ich habe drei Ansätze versucht
- Faden ein Fileinputstream, die aus dem FileDescriptor des Video Ziel
- Anruf MediaRecoder.setOutputFile auf die FD eines ‚Absender‘ Buchse liest. Dieser Socket verbindet sich mit einem LocalSocketServer, dessen Ziel eine "Empfänger" -Buchse ist.
- öffnen Sie eine Buchse auf meinen Server und setOutputFile seine FD
leider beide Versuche gescheitert sind zu geben.
- registriert nur 24 Bytes, wenn i FileInputStream.available nennen (), und die tatsächliche Anzahl von Bytes nur nach i Recorder.stop() aufrufen
gibt mir diese wunderschön nutzlos stacktrace
FEHLER/AndroidRuntime (18532): verursacht durch: java.lang.RuntimeException: Start fehlgeschlagen. ERROR/Android Runtime (18532): bei android.media.MediaRecorder.start (Mutter Methode) ERROR/Android Runtime (18532): bei com.example.demovideo.DemoVideo.initializeCamera (...) ...
gleichen Fehler 2
Code-Schnipsel (parts weggelassen)
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
- richtig speichert eine unbeschädigte Video zu sd
- funktioniert, wenn ich setOutputFile verwenden (pathToFile) statt. die Buchsen arbeiten auch, wenn ich
sender.getOutputStream().write(message.getBytes());
Ich versuche, die gleiche Funktion zu implementieren. Aber ich verstehe deine Methode nicht. Sie legen recorder.setOutputFile zweimal fest: einmal in eine Datei, die andere in einen Socket. Ich denke, der Rekorder arbeitet mit der neuen Datei-ID, wenn Sie Änderungen vornehmen, anstatt mit mehreren Datei-IDs. – user1914692
1) und 2) sind zwei separate Beispiele – ebaum
Wenn sie getrennt sind, wie implementieren Sie dann die beiden Aufgaben gleichzeitig? Wenn Sie die beiden Aufgaben getrennt ausführen, sollte dies ein Problem sein. Für die Streaming-Aufgabe, siehe Spydroid-ipcamera in code.google – user1914692