2011-07-28 11 views
5

Jestem początkującym początkującym użytkownikiem Androida SDK, a ogólnym celem tego projektu jest stworzenie aplikacji bardzo podobnej do Ustream lub Qik (tak, nie wiem, jaki jest najlepszy pomysł dla początkującego). Muszę przesłać na żywo dźwięk i wideo do internetu. Pojawi się serwer wideo, najprawdopodobniej za pomocą Wowzy, obsługujący kodowanie filmów do właściwego formatu.Przesyłanie strumieniowe audio i wideo z systemu Android na komputer/sieć.

Z tego, co odkryłem do tej pory, muszę użyć Android MediaRecorder z kamerą jako źródłem i skierować wyjście na serwer. To ma dla mnie sens, ale nie wiem dokładnie, jak to zrobić. Czy ktoś może dać mi impuls we właściwym kierunku? Przeglądałem przykład na stronie "http://ipcamera-for-android.googlecode.com/svn/trunk", ale wydaje się, że jest to o wiele bardziej skomplikowane, niż jest to konieczne dla tego, co muszę zrobić i nie byłem w stanie uzyskać to działa w Zaćmienie, aby go przetestować.

+0

Mam podobny problem, próbowałem używać WebRTC, ale nie działał w Smart TV (moim problemem jest transmisja między androidem i smart tv), smart tv nie ma chrome :( – vrbsm

Odpowiedz

8

Takie postępowanie nie jest proste, ale możliwe.

Interfejs API MediaRecorder zakłada, że ​​dane wyjściowe są plikami o dostępie swobodnym, co oznacza, że ​​mogą być wysyłane z powrotem i do pisania kontenerem plików mp4 (lub innym). Jak widać w ipcamera-for-android, plik wyjściowy jest kierowany do gniazda, które nie jest dostępem losowym. Fakt sprawia, że ​​trudno jest przeanalizować strumień wychodzący, ponieważ interfejs MediaRecorder API "zapisze" niektóre dane, takie jak fps, sps/pps (na h264) i tak dalej, tylko po zakończeniu nagrywania. Interfejs API spróbuje odszukać początek strumienia (gdzie istnieje nagłówek pliku), ale zakończy się niepowodzeniem, ponieważ strumień jest wysyłany do gniazda, a nie do pliku.

Wykonywanie ipcamera-for-android to dobre odniesienie, jeśli dobrze pamiętam, przed streamingiem, nagrywa wideo do pliku, otwiera nagłówek i pobiera to, co jest potrzebne, niż, zaczyna nagrywanie do gniazdo i używa danych pobranych z nagłówka w celu przeanalizowania strumienia.

Potrzebne będzie także podstawowe zrozumienie podczas analizowania mp4 (lub innego kontenera plików, którego chcesz użyć) w celu przechwycenia klatek. Możesz to zrobić na urządzeniu lub po stronie serwera.

Tutaj jest dobrym początkiem do pisania strumienia do gniazda: Tutorial

Mam nadzieję, że był pomocny, nie ma dobry poradnik do analizowania i dekodowania strumieni wychodzących, ponieważ nie jest tak proste ... ale znowu jest to możliwe przy odrobinie wysiłku.

Spójrz również tutaj, aby zobaczyć, jak kierować strumień wyjściowy do strumienia, który można wysłać do serwera: MediaRecorder Question

+0

Bardzo pomocny guz w dobrym kierunku. do tych linków. Dzięki – ajs

0

SipDroid robi dokładnie to, czego potrzebujesz.

Zawiera hack do obejścia ograniczenia klasy MediaRecorder, które wymagają deskryptora pliku. Zapisuje wynik strumienia wideo MediaRecorder do lokalnej gniazda (stosowana jako rodzaj rury), a następnie ponownego odczytania (w tym samym zgłoszeniu, ale inny wątek) z tego gniazda na drugim końcu, tworzenie RTP pakietach z otrzymanych danych, a na końcu rozgłaszanie pakietów RTP do sieci (możesz użyć tutaj trybu emisji lub emisji pojedynczej, jak chcesz).

Zasadniczo sprowadza się do następującego (uproszczony kod):

// Create a MediaRecorder 
MediaRecorder mr = new MediaRecorder(); 
// (Initialize mr as usual) 
// Create a LocalServerSocket 
LocalServerSocket lss = new LocalServerSocket("foobar"); 
// Connect both end of this socket 
LocalSocket sender = lss.accept(); 
LocalSocket receiver = new LocalSocket(); 
receiver.connect(new LocalSocketAddress("foobar")); 
// Set the output of the MediaRecorder to the sender socket file descriptor 
mr.setOutputFile(sender.getFileDescriptor()); 
// Start the video recording: 
mr.start(); 
// Launch a background thread that will loop, 
// reading from the receiver socket, 
// and creating a RTP packet out of read data. 
RtpSocket rtpSocket = new RtpSocket(); 
InputStream in = receiver.getInputStream(); 
while(true) { 
    fis.read(buffer, ...); 
    // Here some data manipulation on the received buffer ... 
    RtpPacket rtp = new RtpPacket(buffer, ...); 
    rtpSocket.send(rtpPacket); 
} 

Realizacja RtpPacket i RtpSocket klas (dość proste), a dokładnie w kodzie które manipulują zawartość strumienia wideo można znaleźć w Projekt SipDroid (zwłaszcza VideoCamera.java).

Powiązane problemy