Live-Streaming von Videos von einem Android-Handy auf ein anderes über WLAN


115

Ich habe seit Tagen im Internet gesucht, wie man eine Video-Streaming-Funktion von einem Android-Telefon auf ein anderes Android-Telefon über eine WiFi-Verbindung implementiert, aber ich kann anscheinend nichts Nützliches finden. Ich suchte bei Android-Entwicklern nach Beispielcode, Stackoverflow, Google, Android-Blogs, aber nichts. Alles, was ich finden kann, sind Telefon-zu-Desktop- oder Desktop-zu-Telefon-Lösungen für das Streaming, aber nichts, was ich in meiner Implementierung ausleihen kann.

Ich muss einen Roboter mit einem Arduino ADK steuern, also verwende ich zwei Telefone, eines, das am Roboter montiert wird, und eines, das den Videostream vom Roboter empfängt. Ich erwähne dies, weil ich versuche, die kleinste Verzögerung zwischen der Sendezeit und der Sendezeit zu erreichen.

Ich schreibe 2 Apps, eine Master-App zur Steuerung des Roboters (vom Handheld-Telefon), die die Slave-App steuert und den Stream empfängt, und die zweite Slave-App, die auf dem Roboter-Telefon ausgeführt wird und die Motoren / Aktuatoren steuert / Streaming zur Master-App. Ich kann leider keine Apps von Drittanbietern verwenden. Ich muss den Videostream-Code in meine 2 Apps integrieren.

Welche Möglichkeiten gibt es dafür? Es ist auch sehr schwer zu tun, weil ich nie mit Videostreaming gearbeitet habe. Ich mache es sowohl in der Java- als auch in der Android-Entwicklung ziemlich gut. Wie soll ich den Stream codieren / decodieren, wie initiiere ich die Verbindung, muss ich mit UDP anstelle von TCP / IP arbeiten? Ich weiß wirklich nicht, wo ich anfangen soll, ohne Beispielcode irgendwo. Ich bin mir ziemlich sicher, dass dies erreicht werden kann. Ich kann einfach nichts Nützliches finden, um in die richtige Richtung zu starten.

Ich bin über Spydroid gestolpert, aber es verwendet VLC auf einem Desktop, also ist es nicht gut für mich.


EDIT: Schauen Sie sich Cagney Moreaus Blog an . Er geht auf Details zur Umsetzung ein.


1
Können Sie Ihr Projekt teilen, ich mache ähnliche Dinge, aber Streaming-Video zwischen Android & Desktop (WebClient) ... Ich dachte über HTML5 + Websockets nach, aber ich habe viele Probleme ...
Buksy

1
Ich entwickle eine solche Lösung, die zu 80% dem entspricht, was Sie versuchen. Sie müssen einen VOIP-Server konfigurieren und dann Clients für diese VOIP erstellen, die Ihre Sprache und Ihr Video übertragen. Ich suche es auch. Wenn jemand weiß, lass es mich wissen.
AZ_

1
E-Mail wird auf meinem Profil gegeben
AZ_

1
Schau dir mein Projekt an. Alles in Java und ausführlich erklärt cagneymoreau.com/stream-video-android
cagney

1
danke ich arbeite auch an einem roboter. Lustige Sachen
cagney

Antworten:


55

Wenn Sie die Aufnahme- und Wiedergabefunktion in Ihrer App nicht benötigen, ist die Verwendung der Standard-Streaming-App und des Players eine vernünftige Wahl.

Wenn Sie sie jedoch in Ihrer App benötigen, müssen Sie sich die MediaRecorder- API (für die Server- / Kamera-App) und MediaPlayer (für die Client / Player-App) ansehen .

Schneller Beispielcode für den Server:

// this is your network socket
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// this is the unofficially supported MPEG2TS format, suitable for streaming (Android 3.0+)
mMediaRecorder.setOutputFormat(8);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
mMediaRecorder.prepare();
mMediaRecorder.start();

Auf der Spielerseite ist es etwas schwierig, Sie könnten dies versuchen:

// this is your network socket, connected to the server
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(pfd.getFileDescriptor());
mMediaPlayer.prepare();
mMediaPlayer.start();

Leider mag Mediaplayer dies nicht, so dass Sie einige Optionen haben: entweder (a) Speichern von Daten von Socket zu Datei und (nachdem Sie ein bisschen Daten haben) Spielen mit Mediaplayer von Datei zu Datei oder (b) Erstellen eines winzigen http Proxy, der lokal ausgeführt wird und die GET-Anforderung des Mediaplayers akzeptieren, mit HTTP-Headern antworten und dann Daten vom Remote-Server auf diesen kopieren kann. Für (a) würden Sie den Mediaplayer mit einem Dateipfad oder einer Datei-URL erstellen, für (b) geben Sie ihm eine http-URL, die auf Ihren Proxy verweist.

Siehe auch:

Streamen Sie Live-Videos von Telefon zu Telefon mit Socket fd

MediaPlayer ruckelt zu Beginn der MP3-Wiedergabe


2
Hallo Alex, hast du schon Erfahrungen mit dem Senden einer lokal gespeicherten Audiodatei von einem Android-Handy über RTP?
B770

Hallo, kannst du mir bitte das komplette Projekt schicken?
Umar Asghar

1
Kannst du bitte dein komplettes Projekt posten?
Yazhini Murugaiya

welches ist Server-Socket und Client-Socket
Yazhini Murugaiya

1
@AhmedHamdy In der Tat: In API Level 23 (Android 6.0) können Sie setDataSource(MediaDataSource)anstelle von verwenden FileDescriptor. Durch die Implementierung MediaDataSourcekönnen Sie Ihr eigenes Netzwerk lesen und puffern, ohne in eine temporäre Datei schreiben zu müssen.
Alex I

9

Ich habe einmal an so etwas gearbeitet, aber ein Video zu senden und es in Echtzeit abzuspielen, ist eine sehr komplexe Sache. Ich schlage vor, Sie arbeiten nur mit PNGs. In meiner Implementierung habe ich PNGs mit der Host-Kamera erfasst und dann über das Netzwerk an den Client gesendet. Dieser zeigt das Bild an, sobald es empfangen wurde, und fordert das nächste Bild vom Host an. Da Sie über WLAN verfügen, ist die Kommunikation schnell genug, um etwa 8-10 Bilder pro Sekunde zu erhalten (nur Annäherung, ich habe an Bluetooth gearbeitet). Das sieht also wie ein kontinuierliches Video aus, aber mit viel weniger Aufwand. Für die Kommunikation können Sie UDP-Sockets (schneller und weniger komplex) oder DLNA (nicht sicher, wie das funktioniert) verwenden.


Ja, das würde mein letzter Ausweg sein. Danke für die Rückmeldung!
Android

3
Sicherlich wäre ein JPEG-Stream effizienter als ein PNG-Stream?
Stealthcopter

Ich habe nur vorgeschlagen, ein Bild zu verwenden, Sie können jedes
gewünschte

@krossreg> können Sie bitte Beispielcode für das einfügen, was Sie vorschlagen?
Jasper

8

Sie können IP Webcam oder DLNA verwenden. Zum Beispiel werden Samsung-Geräte mit einer App namens AllShare geliefert, die DLNA-fähige Geräte im Netzwerk freigeben und darauf zugreifen kann. Ich denke jedoch, dass IP Webcam Ihre beste Wahl ist. Sie sollten in der Lage sein, den von ihm erstellten Stream mit dem MX Video Player oder ähnlichem zu öffnen.


2
Ich schreibe 2 Apps, eine Master-App, um den Roboter (vom Handheld-Telefon) zu steuern und zu sehen, was der Roboter sieht, und die zweite Slave-App, die auf dem mit Robotern versehenen Telefon ausgeführt wird und die Motoren / Aktuatoren / das Streaming steuert. Ich kann leider keine Apps von Drittanbietern verwenden. Ich muss den Videostream-Code in meine 2 Apps integrieren.
Android

Vielleicht können Sie die DLNA-Spezifikation recherchieren und versuchen, eine App zu erstellen, die sie für sich selbst verwendet, oder dem Entwickler von IP Webcam eine E-Mail senden und um Hilfe bitten.
ldam

1
Reverse Engineering? : P
mgibson

Ja, ich habe keine andere Wahl, denke ich.
Androidu

5

Sie können den Android VLC überprüfen, der Videos streamen und abspielen kann. Wenn Sie mehr indagieren möchten, können Sie deren GIT überprüfen , um zu analysieren, was sie tun. Viel Glück!


3
Ich schaue in Android VLC. Würdest du mir sagen, wie ich damit ein Video streamen kann?
user1914692
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.