通过套接字进行视频流传输并在客户端播放

7
我有两个简单的程序,一个是服务器,一个是客户端,都在本地主机上。我想做的是通过套接字将视频从服务器流式传输到客户端,并且客户端可以使用套接字的文件描述符来播放它。首先,我尝试发送一些消息,客户端可以接收它。之后,我从服务器的SD卡中发送了几个字节的视频到客户端。客户端可以接收这些字节,但无法播放它。有人知道如何解决这个问题吗?
下面是我的服务器和客户端代码片段:
服务器:
        //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();

请查看我的问题:https://dev59.com/l-o6XIcBkEYKwwoYTSou#10260068 - Suvam Roy
2个回答

5
这样做行不通,因为3gp(以及其他派生自avi的文件,如mp4等)在文件末尾有标头(sic)。因此,任何播放器都必须能够访问整个文件。 RTSP/RTP是目前唯一的流视频的方法。HTTP自适应流正在开发中。
另外,如果您想要进行点对点视频(设备之间),您应该知道运营商网络上的所有设备都在NAT防火墙后面。它们只能向外部打开连接。您需要使用某种NAT穿越技术。

Peter,感谢您的回复。我使用http流媒体的原因是因为我想在我的手机上构建一个简单的http服务器,以欺骗媒体播放器它正在接收来自外部的http数据包。这个http服务器需要缓冲来自外部的视频数据包。这可能吗?实际上,我已经使用vlc将rtsp视频数据包流式传输到我的手机上。但我发现这些rtsp数据包无法被缓冲/保存。您有任何建议/意见吗? - charlie
目前安卓尚未支持(自适应)HTTP流媒体。它使用HTTP但只是下载文件。但如果您使用VLC可能会起作用-我没有使用VLC的经验,所以在这里无法给您任何建议。 - Peter Knego

0

我尝试将ffmpeg移植到Android上,以解决Android视频和流格式的问题。但是我发现使用所有网络功能构建适用于Android的ffmpeg相当困难。

RTSP有很多配置用于流媒体,我通过MediaPlayer等方式成功实现了一些你想要的功能,你应该尝试更好地了解你正在从中流式传输的格式(在这种情况下是vlc)。

此外,看看darwin流媒体服务器,它很容易配置,我能够使用它将流式传输到Android设备。


非常感谢。我已经成功通过VLC流传输RTSP数据包,但问题是安卓端似乎不支持RTSP的许多功能,例如缓冲流数据。这就是为什么我正在尝试构建一个HTTP本地服务器来提供数据,以便我可以控制。实际上,VLC也支持HTTP流媒体,但它非常不稳定。我还没有尝试过达尔文。 - charlie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接