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
- nawlec FileInputStream który odczytuje z deskryptora pliku wideo przeznaczenia
- wezwanie MediaRecoder.setOutputFile na FD z gniazdem 'nadawcy. to gniazdo łączy się z serwerem LocalSocketServer , którego odbiorcą jest gniazdo "odbiorcze".
- otworzyć gniazda do mojego serwera i dając setOutputFile jego FD
niestety obie próby zawiodły.
- Tylko rejestruje 24 bajtów Ilekroć zadzwonić FileInputStream.available(), i rzeczywistą liczbę bajtów tylko po zgłoszę Recorder.stop()
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 (...) ...
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
- poprawnie zapisuje nieuszkodzonej wideo SD
- prac, jeśli mogę użyć setOutputFile (pathToFile) zamiast. gniazda działa również gdy uruchamiam
sender.getOutputStream().write(message.getBytes());
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
1) i 2) są dwoma oddzielnymi przykładami. – ebaum
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