2011-01-09 5 views
6

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

  1. Faden ein Fileinputstream, die aus dem FileDescriptor des Video Ziel
  2. Anruf MediaRecoder.setOutputFile auf die FD eines ‚Absender‘ Buchse liest. Dieser Socket verbindet sich mit einem LocalSocketServer, dessen Ziel eine "Empfänger" -Buchse ist.
  3. öffnen Sie eine Buchse auf meinen Server und setOutputFile seine FD

leider beide Versuche gescheitert sind zu geben.

  1. registriert nur 24 Bytes, wenn i FileInputStream.available nennen (), und die tatsächliche Anzahl von Bytes nur nach i Recorder.stop() aufrufen
  2. 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 (...) ...

  3. 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 
  1. richtig speichert eine unbeschädigte Video zu sd
  2. funktioniert, wenn ich setOutputFile verwenden (pathToFile) statt. die Buchsen arbeiten auch, wenn ich sender.getOutputStream().write(message.getBytes());
+0

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

+0

1) und 2) sind zwei separate Beispiele – ebaum

+0

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

Antwort

2
  1. betreibe ich ein Video Mobil-zu-Server erstellt Streaming-App mit diesem Ansatz und es funktionierte. Das sollte also der richtige Ansatz sein. Später, als ich nicht mehr am Projekt beteiligt war, bekam ich Berichte, dass dieser Ansatz mit einigen neueren Handys nicht funktioniert - vor allem Samsung Galaxy S. Das Problem war, dass diese Telefone die Videodaten sparsam gespült haben, nur einmal pro Minute. Mit welchem ​​Telefon verwendest du das?

  2. & 3. MediaRecorder ist ein Wrapper um eine native Bibliothek. Ich nehme an, dass diese Bibliothek möchte, dass eine konkrete Datei nicht in eine Pipe geschrieben wird. Auf Dateien auf Dateisystemebene sehen die Dateien & gleich aus, aber man kann keinen wahlfreien Zugriff auf eine Pipe haben (seeking).

+0

Ich benutze die ... Galaxie S. Ich habe das nicht kommen sehen, danke für den Haken! Wenn ich das Empfänger-Socket auf die Ausgabe in eine Datei setzen würde, würden 2 oder 3 arbeiten? – ebaum

+0

Hallo, ich versuche auch das Gleiche zu tun ... Hast du zufällig ein Huawei IDEOS Handy oder HTC G1 ausprobiert? Wenn nein, kann ich auf die APK zugreifen und sie testen? Vielen Dank. – Rob

+0

Es funktionierte auf G1 zu dieser Zeit (vor etwa 1,5 Jahren), weiß nicht über das andere Telefon. Die Apk ist auf www.livecliq.net. Ich weiß nichts über den aktuellen Status des Projekts. –