2011-01-09 16 views
6

Próbuję uzyskać strumień wideo z punktu A (telefon z systemem Android 2.1) do punktu B (mój serwer) w czasie rzeczywistym. Jak to zrobić? Szczegółowy poniżej są moje próby (trochę długie, ale zwięzłe!)Przesyłanie pliku MediaRecorder podczas nagrywania


Celem jest uzyskanie godzinny film nagrany z telefonu do serwera bez wstrzymywania/zatrzymywania strumienia. opóźnienie do kilku minut nie stanowi problemu. Próbowałem trzy podejścia

  1. nawlec FileInputStream który odczytuje z deskryptora pliku wideo przeznaczenia
  2. wezwanie MediaRecoder.setOutputFile na FD z gniazdem 'nadawcy. to gniazdo łączy się z serwerem LocalSocketServer , którego odbiorcą jest gniazdo "odbiorcze".
  3. otworzyć gniazda do mojego serwera i dając setOutputFile jego FD

niestety obie próby zawiodły.

  1. Tylko rejestruje 24 bajtów Ilekroć zadzwonić FileInputStream.available(), i rzeczywistą liczbę bajtów tylko po zgłoszę Recorder.stop()
  2. daje mi to pięknie bezużyteczną StackTrace

    BŁĄD/AndroidRuntime (18532): Spowodowany przez: java.lang.RuntimeException: start nie powiodło się. ERROR/Android Runtime (18532): co android.media.MediaRecorder.start (metoda podstawowa) błąd/Android Runtime (18532): co com.example.demovideo.DemoVideo.initializeCamera (...) ...

  3. sam błąd 2

fragmenty kodu (części pominięto)

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. poprawnie zapisuje nieuszkodzonej wideo SD
  2. prac, jeśli mogę użyć setOutputFile (pathToFile) zamiast. gniazda działa również gdy uruchamiam sender.getOutputStream().write(message.getBytes());
+0

Próbuję wprowadzić tę samą funkcję. Ale nie dostaję twojej metody. Ustaw recorder.setOutputFile dwa razy: jeden raz na plik, drugi na gniazdo. Myślę, że rekorder będzie pracował z nowym identyfikatorem fileID za każdym razem, gdy się zmieni, a nie z wieloma identyfikatorami plików. – user1914692

+0

1) i 2) są dwoma oddzielnymi przykładami. – ebaum

+0

Jeśli są oddzielne, to w jaki sposób realizujesz dwa zadania w tym samym czasie? W rzeczywistości, jeśli wykonasz te dwa zadania osobno, problem powinien być trudny. Aby zobaczyć zadanie przesyłania strumieniowego, zobacz Spydroid-ipcamera w code.google – user1914692

Odpowiedz

2
  1. I stworzył film mobile-serwer strumieniowania aplikacji z tym podejściem i to działało. To powinno być właściwe podejście. Później, kiedy nie byłem już częścią projektu, dostałem doniesienia, że ​​to podejście nie zadziałało w przypadku niektórych nowszych telefonów - w szczególności Samsunga Galaxy S. Problem polegał na tym, że te telefony spłukiwały dane wideo oszczędnie, może tylko raz na minutę. Jakiego telefonu używasz do testowania tego?

  2. & 3. MediaRecorder jest wrapper wokół rodzimej biblioteki. Zakładam, że ta biblioteka chce konkretnego pliku do zapisania, a nie potoku. Na poziomie systemu plików pliki & wyglądają tak samo, ale nie można mieć losowego dostępu do potoku (szukanie).

+0

Używam ... galaktyki S. Nie widziałem, że to nadchodzi, dzięki za złapanie! Jeśli miałbym ustawić gniazdo odbiornika na wyjście do pliku, czy 2 lub 3 działałyby? – ebaum

+0

Witam, ja też próbuję zrobić to samo ... Czy przypadkiem próbowałeś na telefonie Huawei IDEOS lub HTC G1? Jeśli nie, czy mogę uzyskać dostęp do pliku APK i przetestować go? Dzięki. – Rob

+0

To działało na G1 w tym czasie (około 1,5 roku temu), nie wiem o drugim telefonie. APK jest na www.livecliq.net. Nie wiem o aktualnym statusie projektu. –

Powiązane problemy