2010-11-20 15 views
6

私は2つの簡単なプログラム、サーバーとクライアントの両方をlocalhostに持っています。私がしたいのは、サーバーからクライアントへのビデオをソケット経由でストリーミングし、クライアントがソケットのfilediscriptorを使用してビデオを再生できるようにすることです。最初にメッセージを送信しようとしましたが、クライアントはそれを受け取ることができます。その後、サーバーのカードからクライアントにビデオの数バイトを送ります。クライアントはこれらのバイトを受信できますが、再生できません。誰もが問題を解決する方法を知っていますか?ここでビデオはソケットを介してストリーミングされ、クライアントから再生されます

は私のサーバーとクライアントのコードスニペットです:

サーバー:

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

クライアント:

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

私の見ている - http://stackoverflow.com/questions/6116880/stream-live-video-from-phone-to-phone-using-socket-fd/10260068#10260068 –

答えて

5

これはmp4好きなので3gp(および他のavi派生ファイルを動作しません。 、など)は、ファイルの最後にヘッダ(sic)を持っています。したがって、どのプレイヤーもファイル全体にアクセスできる必要があります。

RTSP/RTPは、現時点でビデオをストリーミングする唯一の方法です。 HTTPアダプティブストリーミングが動作しています。

また、p2pビデオ(デバイスからデバイス)を実行しようとしている場合は、オペレータネットワーク上のすべてのデバイスがNATファイアウォールの背後にあることがわかります。彼らはアウトバウンド接続のみを開くことができます。何らかのNATピアシングを使用する必要があります。

+0

ピーター、あなたの返信ありがとう。私がhttpストリーミングを使用している理由は、携帯電話で単純なhttpserverを構築して、外部からhttpパケットを受信して​​いるmediaplayerを騙したいからです。このhttpserverは、外部からのビデオパケットをバッファリングする必要があります。それは可能ですか?実際に私は電話にrstpビデオパケットをストリームするためにvlcを使用しています。しかし、これらのrtspパケットはバッファリング/保存できないことがわかりました。これに関する提案やアドバイスはありますか? – charlie

+0

現在、アンドロイドは(アダプティブ)httpストリーミングをサポートしていません。 HTTPを使用しますが、ファイルをダウンロードするだけです。しかし、VLCを使っていれば、VLCの経験はありませんので、ここでアドバイスをすることはできません。 –

0

私は、アンドロイドのビデオとストリーミングの形式の問題を解決するために、ffmpegをアンドロイドに移植しようとしました。しかし、私はすべてのネットワークのものでアンドロイドのためのffmpegを構築することはかなり難しいことを知った。

RTSPにはストリーミングの設定がたくさんあるので、MediaPlayerなどで必要なものを手に入れることができました。ストリーミングしているフォーマット(その場合はvlc)を少し良くしてみてください。

また、構成が簡単なダーウィンストリーミングサーバーで多くのことを行い、それを使ってアンドロイドデバイスにストリーミングすることができました。

+0

ありがとうございました。私はvlcでrtspパケットをストリーミングすることに成功しましたが、問題はアンドロイド側がストリーミングデータのバッファリングなど、rtspの多くの機能をサポートしていないようです。そのため、私が制御できるものとしてデータを供給するためのhttpローカルサーバーを構築しようとしています。実際にはvlcもhttpストリーミングをサポートしていますが、かなり不安定です。私はダーウィンを試していない。 – charlie

関連する問題