【问题标题】:Video streaming through socket and playing from client通过套接字流式传输视频并从客户端播放
【发布时间】:2010-11-20 08:03:17
【问题描述】:

我有两个简单的程序,服务器和客户端,都在本地主机上。我想要做的是通过套接字将视频从服务器流式传输到客户端,客户端可以使用套接字的 filediscriptor 播放它。首先,我尝试发送一些消息,客户端可以接收它。之后,我将一些字节的视频从服务器的 SD 卡发送到客户端。客户端可以接收这些字节但不能播放它。有谁知道如何解决这个问题?

这是我的服务器和客户端代码 sn-ps:

服务器:

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

【问题讨论】:

标签: android


【解决方案1】:

这不起作用,因为3gp(和其他avi 派生文件,如mp4 等)在文件末尾有标题(原文如此)。所以任何玩家都必须有权访问整个文件。

RTSP/RTP 是目前流式传输视频的唯一方式。 HTTP 自适应流媒体正在开发中。

此外,如果您尝试制作 p2p 视频(设备到设备),您应该知道运营商网络上的所有设备都位于 NAT 防火墙之后。他们只能打开出站连接。您需要使用某种 NAT 穿透。

【讨论】:

  • 彼得,感谢您的回复。我使用 http 流的原因是因为我想在我的手机中构建一个简单的 httpserver 来欺骗媒体播放器,它正在从外部接收 http 数据包。这个 httpserver 需要缓冲来自外部的视频数据包。那可能吗?实际上,我使用 vlc 将 rstp 视频数据包流式传输到我的手机。但我发现那些 rtsp 数据包无法缓冲/保存。您对此有什么建议/意见吗?
  • 目前android还不支持(自适应)http流。它使用 HTTP 但只是下载文件。但是如果你使用 VLC 可能会起作用 - 我没有使用 VLC 的经验,所以我不能在这里给你任何建议。
【解决方案2】:

我尝试将 ffmpeg 移植到 android 以解决 android 的视频和流格式问题。但我发现用所有网络东西为 android 构建 ffmpeg 非常困难。

RTSP 有很多流式传输配置,我设法通过 MediaPlayer 和其他东西获得了您想要的东西,您应该尝试更好地了解您正在流式传输的格式(在这种情况下为 vlc)。

另外,在 darwin 流媒体服务器上花了很多时间,它易于配置,我能够使用它流式传输到 android 设备。

【讨论】:

  • 非常感谢。我已经设法通过vlc流式传输rtsp数据包,但问题是android端似乎不支持rtsp的很多功能,例如缓冲流数据。这就是为什么我试图构建一个 http 本地服务器来提供我可以控制的数据。实际上 vlc 也支持 http 流,但它很不稳定。我没试过达尔文。
猜你喜欢
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 2020-06-23
  • 2015-05-06
  • 2012-04-15
  • 2011-02-14
相关资源
最近更新 更多