2010-11-20 30 views
6

Her ikisi de localhost'ta iki basit program, sunucu ve istemci var. Benim yapmak istediğim, videoyu sunucudan istemciye soket aracılığıyla akıtmak ve istemcinin soketin dosya kodunu kullanarak oynatabilmesi. Önce bir mesaj yollamaya çalışıyorum ve müşteri bunu alabilir. Bundan sonra sunucunun kartından istemciye birkaç bayt video yolluyorum. İstemci bu baytları alabilir, ancak oynayamaz. Sorunu nasıl çözeceğini bilen var mı? İşte Soket üzerinden video akışı ve istemciden oynatma

benim sunucu ve istemci kod parçacıklarını geçerli:

Sunucu:

 //Receive request from client. 
    Socket client=serversocket.accept(); 
    System.out.println("accept"); 

    //Receive client message. 
    BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); 
    String str=in.readLine(); 
    System.out.println("read:"+str); 

    //Send message to client. 
    //PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true); 
    //out.println("server message"); 
    FileInputStream fis=new FileInputStream("/sdcard/toystory3.3gp"); 
    byte buffer[]=new byte[2000]; 
    fis.read(buffer,0,20); 
    DataOutputStream out=new DataOutputStream(client.getOutputStream()); 
    out.write(buffer,0,20); 
    in.close(); 
    out.close(); 
    client.close(); 
    System.out.println("close"); 

Müşteri: Bu mp4 gibi çünkü 3gp (ve diğer avi türetilen dosyaları çalışmaz

Socket socket=new Socket("127.0.0.1",4444); 
String message="Initial"+"\r\n"; 
//Send message to server. 
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); 
out.println(message); 

//Receive message from server. 
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String msg=br.readLine(); 
//ParcelFileDescriptor pfd=ParcelFileDescriptor.fromSocket(socket); 
//MediaPlayer m=new MediaPlayer(); 
//m.setDataSource(pfd.getFileDescriptor()); 
//m.prepare(); 
//m.start(); 

if(msg!=null) 
{ 
    System.out.println("Data received."); 
    System.out.println(msg); 
} 
else 
{ 
    System.out.println("Data not received."); 
} 
out.close(); 
br.close(); 
socket.close(); 
+0

Bakın http://stackoverflow.com/questions/6116880/stream-live-video-from-phone-to-phone-using-socket-fd/10260068#10260068 –

cevap

5

, vb) dosyanın sonunda başlık (sic) var. Yani herhangi bir oyuncu tüm dosyaya erişime sahip olmalıdır. Şu anda video akışını yapmanın tek yolu

RTSP/RTP. HTTP uyarlamalı akış eserlerde. Ayrıca, p2p video (cihazdan cihaza) yapmaya çalışıyorsanız, operatör ağlarındaki tüm cihazların NAT güvenlik duvarının arkasında olduğunu bilmeniz gerekir. Sadece bağlantıları açabilirler. Bir çeşit NAT delici kullanmanız gerekecek.

+0

Peter, cevabınız için teşekkürler . Http akışını kullanmamın sebebi, telefonumda mediaplayer'ı dışarıdan http paketleri aldığını kandırmak için basit bir httpserver oluşturmak istiyorum. Bu httpserver'ın video paketlerini dışarıdan tamponlaması gerekiyor. Mümkün mü? Aslında rstp video paketlerini telefonuma aktarmak için vlc kullanıyorum. Ama rtsp paketlerinin arabelleğe alınamayacağını/kaydedilemediğini buldum. Bunun hakkında herhangi bir öneriniz/tavsiyeniz var mı? – charlie

+0

Şu anda, android henüz (adaptif) http akışını desteklemiyor. HTTP kullanır, ancak dosyayı indirir. Ama eğer işe yarayacak VLC kullanırsanız - VLC ile deneyimim yok, bu yüzden size herhangi bir tavsiye veremedim. –

0

Android için video ve akış biçimlerinin sorununu çözmek için ffmpeg'e bağlantı kurmayı denedim. Ama ben tüm ağ şeyler ile android için ffmpeg bina oldukça zor olduğunu öğrendim.

RTSP, akış için bir çok konfigürasyona sahiptir, MediaPlayer ve istediğiniz gibi bir şey elde etmeyi başardım, akışını yaptığınız formatları (bu durumda vlc) öğrenmeye çalışmalısınız. .

Ayrıca, çok fazla akış sunucusunu çok kolay bir şekilde yapılandırın, bunu kullanarak bir android cihaza aktarabiliyordum.

+0

Çok teşekkürler. RTSP paketlerini vlc ile aktarmayı başardım, ama problem, android tarafı, rtsp işlevlerini desteklemiyor gibi görünüyor; Bu yüzden veriyi kontrol edebileceğim şekilde beslemek için bir http yerel sunucu kurmaya çalışıyorum. Aslında vlc ayrıca http akışını destekliyor, ancak oldukça kararsız. Darwin'i denemedim. – charlie