Bir Android telefondan diğerine WiFi üzerinden canlı video akışı


115

Bir Android telefondan başka bir android telefona bir WiFi bağlantısı üzerinden bir video akış özelliğinin nasıl uygulanacağına dair günlerdir internette arama yaptım, ancak yararlı bir şey bulamıyorum. Örnek kod, stackoverflow, google, android blogları için android geliştiricilerine baktım ama hiçbir şey yok. Tek bulabildiğim akış için bir çeşit telefondan masaüstüne veya masaüstünden telefona çözümler, ancak uygulamamda ödünç alabileceğim hiçbir şey yok.

Bir arduino ADK kullanarak bir robotu kontrol etmem gerekiyor, bu yüzden biri robota monte edilecek ve diğeri robottan video akışını alacak 2 telefon kullanıyorum. Bundan bahsediyorum çünkü yayın zamanı ile izlenme zamanı arasındaki en küçük gecikmeyi elde etmeye çalışıyorum.

Köle uygulamasını kontrol edecek ve akışı alacak olan robotu kontrol etmek için (el telefonundan) bir ana uygulama ve robot askılı telefonda çalışacak, motorları / aktüatörleri kontrol edecek ikinci bağımlı uygulama olmak üzere 2 uygulama yazıyorum. / ana uygulamaya akış. Maalesef üçüncü parti uygulamaları kullanamıyorum. Video akış kodunu 2 uygulamama entegre etmem gerekiyor.

Bunu başarmak için hangi seçenekler var? Ayrıca bunu yapmak çok zor çünkü hiç video akışı ile çalışmadım, ancak hem Java hem de Android geliştirmede oldukça iyi yapıyorum. Akışı nasıl kodlamalı / kodunu çözmeliyim, bağlantıyı nasıl başlatırım, TCP / IP yerine UDP ile çalışmam gerekecek mi? Nereden başlayacağımı gerçekten bilmiyorum, hiçbir yerde örnek kod yok. Bunun başarılabileceğinden oldukça eminim. Doğru yönde başlamamı sağlayacak yararlı hiçbir şey bulamıyorum.

Ben tökezledi SpyDroid ama benim için onun hiç iyi böylece bir masaüstü VLC kullanıyor.


DÜZENLEME: Cagney Moreau'nun bloguna göz atın . Bunu uygulamakla ilgili ayrıntılara giriyor.


1
Projenizi paylaşır, ben benzer bir şey yapıyor, ama (WebClient) android & masaüstüne arasındaki video akışı ediyorum ... Ben html5 + WebSockets ama birçok sorunlarla karşı karşıya ki ... düşündüm
Buksy

1
Böyle bir çözüm geliştiriyorum, sizin yapmaya çalıştığınız şeyle% 80 aynı. Bir VOIP sunucusu yapılandırmanız ve ardından bu VOIP için sesinizi ve videonuzu aktaracak istemciler oluşturmanız gerekir. Ben de arıyorum. Herhangi biri biliyorsa lütfen bana bildirin.
AZ_

1
e-posta profilimde verildi
AZ_

1
Projeme bakın. Her şey javada ve ayrıntılı olarak anlatılıyor cagneymoreau.com/stream-video-android
Cagney'in

1
teşekkürler ayrıca bir robot üzerinde çalışıyorum. Eğlenceli şeyler
cagney

Yanıtlar:


55

Uygulamanızda kayıt ve oynatma işlevine ihtiyacınız yoksa, kullanıma hazır akış uygulamasını ve oynatıcıyı kullanmak makul bir seçimdir.

Bununla birlikte, uygulamanızda olmalarına ihtiyacınız varsa, MediaRecorder API (sunucu / kamera uygulaması için) ve MediaPlayer'a bakmanız gerekecektir. (istemci / oynatıcı uygulaması için) .

Sunucu için hızlı örnek kod:

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

Oyuncu tarafında biraz zor, şunu deneyebilirsiniz:

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

Maalesef mediaplayer bundan hoşlanmaz, bu yüzden birkaç seçeneğiniz vardır: ya (a) verileri soketten dosyaya kaydetme ve (biraz veriye sahip olduktan sonra) medyaplayer ile dosyadan oynatma veya (b) küçük bir http yap yerel olarak çalışan ve medyaplayıcının GET isteğini kabul edebilen, HTTP üstbilgileriyle yanıtlayabilen ve ardından uzak sunucudaki verileri ona kopyalayan proxy. (A) için, medya oynatıcıyı bir dosya yolu veya dosya url'si ile oluşturursunuz, (b) için ona proxy'nize işaret eden bir http url'si verirsiniz.

Ayrıca bakınız:

Soket fd kullanarak telefondan telefona canlı video akışı gerçekleştirin

MediaPlayer mp3 oynatmanın başlangıcında takılıyor


2
Merhaba Alex, RTP aracılığıyla bir android telefondan yerel olarak depolanmış bir ses dosyası gönderme konusunda herhangi bir deneyiminiz var mı?
B770

merhaba bana projesinin tamamını gönderebilir misiniz?
Umar Asghar

1
lütfen projenizin tamamını gönderebilir misiniz?
Yazhini Murugaiya

hangisi sunucu soketi ve istemci soketi
Yazhini Murugaiya

1
@AhmedHamdy Indeed: API seviyesi 23'te (Android 6.0) setDataSource(MediaDataSource)yerine kullanabilirsiniz FileDescriptor. Uygulama MediaDataSource, geçici bir dosyaya yazmadan kendi ağınızı okumanızı ve arabelleğe almanızı sağlar.
Alex,

9

Bir zamanlar bunun gibi bir şey üzerinde çalıştım, ancak bir video göndermek ve gerçek zamanlı olarak oynatmak gerçekten karmaşık bir şey. Yalnızca PNG'ler ile çalışmanızı öneririm. Benim uygulamamda Yaptığım şey, ana kamerayı kullanarak PNG'leri yakalamak ve ardından bunları ağ üzerinden istemciye göndermekti. Bu, görüntüyü alır almaz gösterecek ve ana bilgisayardan sonraki görüntüyü isteyecektir. Kablosuz bağlantıda olduğunuz için, bu iletişim saniyede 8-10 görüntü elde edecek kadar hızlı olacaktır (yalnızca yaklaşık olarak, Bluetooth üzerinde çalıştım). Yani bu sürekli bir video gibi görünecek, ancak çok daha az çabayla. İletişim için UDP soketlerini (Daha hızlı ve daha az karmaşık) veya DLNA'yı (Bunun nasıl çalıştığından emin değilim) kullanabilirsiniz.


Evet, bu son çare olacaktı. Geri dönüşünüz için teşekkür ederiz!
androidu

3
Şüphesiz bir jpeg akışı, bir png akışından daha verimli olurdu?
stealthcopter

Ben sadece bir resim kullanmanızı öneriyordum, istediğiniz herhangi bir formatı kullanabilirsiniz
Arveen

@krossreg> Önerdiğiniz şey için örnek kodu yapıştırabilir misiniz?
Jasper

8

Sen kullanabilirsiniz IP Webcam , ya da belki DLNA'yı kullanın. Örneğin Samsung cihazları, ağdaki DLNA özellikli cihazları paylaşabilen ve bunlara erişebilen AllShare adlı bir uygulama ile birlikte gelir. Bence IP Webcam en iyi seçeneğiniz. Oluşturduğu akışı MX Video oynatıcı veya benzeri bir şey kullanarak açabilmelisiniz.


2
Robotu (cep telefonundan) kontrol etmek ve robotun gördüklerini görüntülemek için bir ana uygulama ve motorları / aktüatörleri / akışı kontrol eden robot askılı telefonda çalışacak ikinci bağımlı uygulama olmak üzere 2 uygulama yazıyorum. Maalesef üçüncü parti uygulamaları kullanamıyorum. Video akış kodunu 2 uygulamama entegre etmem gerekiyor.
androidu

Belki de DLNA spesifikasyonu hakkında biraz araştırma yapabilir ve bunu kendi başınıza kullanarak bir uygulama oluşturmaya çalışabilir veya belki IP Webcam'in geliştiricisine e-posta gönderebilir ve yardım isteyebilirsiniz.
ldam

1
Tersine mühendislik mi? : P
mgibson

Evet, başka seçeneğim yok sanırım.
androidu

5

Kontrol edebilirsiniz android VLC daha indagate isterseniz kendi kontrol edebilirsiniz, bu akarsu ve oynatılan video GIT ne onların do analiz etmek. İyi şanslar!


3
Android VLC'ye bakıyorum. Bir videoyu izlemek için nasıl kullanacağımı söyler misin?
user1914692
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.