Video streaming langsung dari satu ponsel Android ke ponsel lainnya melalui WiFi

115

Saya telah mencari di internet selama berhari-hari sekarang tentang bagaimana menerapkan fitur streaming video dari ponsel android ke ponsel android lain melalui koneksi WiFi tetapi sepertinya saya tidak dapat menemukan sesuatu yang berguna. Saya mencari di pengembang android untuk kode sampel, stackoverflow, google, blog android tetapi tidak ada. Yang dapat saya temukan hanyalah semacam solusi telepon-ke-desktop atau desktop-ke-telepon untuk streaming, tetapi tidak ada yang dapat saya pinjam dalam penerapan saya.

Saya perlu mengontrol robot menggunakan arduino ADK, jadi saya menggunakan 2 ponsel, satu yang akan dipasang pada robot dan yang lainnya akan menerima aliran video dari robot. Saya menyebutkan ini karena saya berusaha mencapai penundaan terkecil antara waktu siaran dan waktu menonton.

Saya menulis 2 aplikasi, satu aplikasi utama untuk mengontrol robot (dari ponsel genggam) yang akan mengontrol aplikasi budak dan menerima aliran, dan aplikasi budak kedua yang akan berjalan di ponsel yang diikat robot, mengendalikan motor / aktuator / streaming ke aplikasi master. Sayangnya saya tidak dapat menggunakan aplikasi pihak ketiga. Saya perlu mengintegrasikan kode aliran video ke dalam 2 aplikasi saya.

Pilihan apa yang ada untuk mencapai ini? Juga sangat sulit untuk dilakukan karena saya tidak pernah bekerja dengan videostreaming, meskipun saya cukup bagus dalam pengembangan Java dan Android. Bagaimana saya harus menyandikan / mendekode aliran, bagaimana cara memulai koneksi, apakah saya perlu bekerja dengan UDP, bukan TCP / IP? Saya benar-benar tidak tahu harus mulai dari mana, tanpa kode sampel di mana pun. Saya cukup yakin ini bisa tercapai. Saya tidak dapat menemukan sesuatu yang berguna untuk membantu saya memulai ke arah yang benar.

Saya menemukan spydroid tetapi menggunakan VLC di desktop jadi itu tidak baik untuk saya.


EDIT: Lihat blog Cagney Moreau . Dia menjelaskan secara rinci tentang penerapan ini.

androidu
sumber
1
Dapatkah Anda membagikan proyek Anda, saya melakukan hal serupa, tetapi streaming video antara android & desktop (WebClient) ... Saya memikirkan tentang html5 + websockets tetapi saya menghadapi banyak masalah ...
Buksy
1
Saya sedang mengembangkan solusi seperti itu, yaitu 80% sama dengan apa yang Anda coba lakukan. Anda perlu mengkonfigurasi server VOIP dan kemudian membuat klien untuk VOIP itu yang akan mentransfer suara dan video Anda. Saya juga sedang mencarinya. jika ada yang tahu tolong beri tahu saya.
AZ_
1
email diberikan di profil saya
AZ_
1
Lihat proyek saya. Semuanya di java dan dijelaskan secara rinci cagneymoreau.com/stream-video-android
cagney
1
terima kasih saya juga sedang mengerjakan robot. Hal-hal menyenangkan
cagney

Jawaban:

55

Jika Anda tidak memerlukan fungsionalitas perekaman dan pemutaran di aplikasi Anda, menggunakan aplikasi dan pemutar streaming off-the-shelf adalah pilihan yang masuk akal.

Namun, jika Anda memang membutuhkannya di aplikasi Anda, Anda harus melihat ke MediaRecorder API (untuk aplikasi server / kamera) dan MediaPlayer (untuk aplikasi klien / pemutar).

Kode contoh cepat untuk 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();

Di sisi pemain, ini agak rumit, Anda dapat mencoba ini:

// 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();

Sayangnya mediaplayer cenderung tidak seperti ini, jadi Anda memiliki beberapa opsi: (a) menyimpan data dari soket ke file dan (setelah Anda memiliki sedikit data) bermain dengan mediaplayer dari file, atau (b) membuat http kecil proxy yang berjalan secara lokal dan dapat menerima permintaan GET dari mediaplayer, membalas dengan header HTTP, lalu menyalin data dari server jarak jauh ke sana. Untuk (a) Anda akan membuat mediaplayer dengan jalur file atau url file, untuk (b) berikan URL http yang menunjuk ke proxy Anda.

Lihat juga:

Streaming video langsung dari ponsel ke ponsel menggunakan soket fd

MediaPlayer tersendat saat memulai pemutaran mp3

Alex I
sumber
2
Halo Alex, apakah Anda punya pengalaman dengan mengirim file audio yang disimpan lokal dari ponsel android melalui RTP?
B770
hai dapatkah Anda mengirimkan saya proyek lengkapnya?
Umar Asghar
1
bisakah Anda memposting proyek lengkap Anda?
Yazhini Murugaiya
yang mana adalah soket server dan soket klien
Yazhini Murugaiya
1
@AhmedHamdy Memang: di API level 23 (Android 6.0) Anda dapat menggunakan setDataSource(MediaDataSource)sebagai ganti FileDescriptor. Menerapkan MediaDataSourceakan memungkinkan Anda melakukan pembacaan dan buffering jaringan Anda sendiri, tanpa menulis ke file temp.
Alex I
9

Saya pernah mengerjakan sesuatu seperti ini sekali, tetapi mengirim video dan memutarnya secara real time adalah hal yang sangat rumit. Saya sarankan Anda bekerja dengan PNG saja. Dalam implementasinya Apa yang saya lakukan adalah menangkap PNG menggunakan kamera host dan kemudian mengirimkannya melalui jaringan ke klien, yang akan menampilkan gambar segera setelah diterima dan meminta gambar berikutnya dari host. Karena Anda menggunakan wifi, komunikasi itu akan cukup cepat untuk mendapatkan sekitar 8-10 gambar per detik (hanya perkiraan, saya bekerja di Bluetooth). Jadi ini akan terlihat seperti video berkelanjutan tetapi dengan usaha yang jauh lebih sedikit. Untuk komunikasi, Anda dapat menggunakan soket UDP (Lebih cepat dan tidak rumit) atau DLNA (Tidak yakin cara kerjanya).

Arveen
sumber
Ya, ini akan menjadi pilihan terakhirku. Terima kasih untuk umpan baliknya!
androidu
3
Tentunya aliran jpeg akan lebih efisien daripada aliran png?
stealthcopter
Saya hanya menyarankan untuk menggunakan gambar, Anda dapat menggunakan format apa pun yang Anda inginkan
Arveen
@ Crossreg> dapatkah Anda menempelkan kode contoh untuk saran Anda?
Jasper
8

Anda dapat menggunakan IP Webcam , atau mungkin menggunakan DLNA. Misalnya perangkat Samsung hadir dengan aplikasi bernama AllShare yang dapat berbagi dan mengakses perangkat berkemampuan DLNA di jaringan. Saya pikir IP Webcam adalah pilihan terbaik Anda. Anda harus dapat membuka aliran yang dibuatnya menggunakan pemutar Video MX atau semacamnya.

ldam
sumber
2
Saya menulis 2 aplikasi, satu aplikasi master untuk mengontrol robot (dari ponsel genggam) dan untuk melihat apa yang dilihat robot, dan aplikasi budak kedua yang akan berjalan di ponsel yang diikat robot, mengendalikan motor / aktuator / streaming. Sayangnya saya tidak dapat menggunakan aplikasi pihak ketiga. Saya perlu mengintegrasikan kode aliran video ke dalam 2 aplikasi saya.
androidu
Mungkin Anda dapat melakukan penelitian tentang spesifikasi DLNA dan mencoba membuat aplikasi yang menggunakannya untuk Anda sendiri atau mungkin mengirim email ke pengembang IP Webcam dan meminta bantuan.
ldam
1
Membalikkan itu? : P
mgibson
Ya, kurasa aku tidak punya pilihan lain.
androidu
5

Anda dapat memeriksa VLC android itu dapat melakukan streaming dan memutar video, jika Anda ingin lebih banyak bermain, Anda dapat memeriksa GIT mereka untuk menganalisis apa yang mereka lakukan. Semoga berhasil!

Ricardo Ortega Magaña
sumber
3
Saya melihat ke Android VLC. Bisakah Anda memberi tahu saya cara menggunakannya untuk streaming video?
pengguna1914692