从 java 服务器向 android 客户端直播视频的最佳方式?
Best way to live stream video from java server to android client?
几天以来,我一直在寻找将 PC 屏幕从 Java 服务器直播到 Android 客户端 的 最佳方式,但我不能'找不到 TCP 套接字的其他方法。
我想将 从 PC 流式传输到 Android 客户端。
现在我只是通过 TCP 套接字发送图像(帧)。它工作正常,但这是缺点:
- 带宽消耗大(通过多个客户端单播)
- 服务器和客户端之间轮换几秒
- 低帧率
我尝试使用 UDP 套接字,但如何处理最大尺寸为 64Ko 的数据包?
最好的解决方案是 UDP 和 multicast 但我在 Android 上读到了一些关于它的问题,这取决于设备。
提前感谢您的回答!
我终于成功地在 Java 服务器
上通过 RTP 流式传输我的电脑屏幕
代码:
public static void main(String[] args) throws Exception {
boolean found = new NativeDiscovery().discover();
System.out.println(found);
System.out.println(LibVlc.INSTANCE.libvlc_get_version());
String media = "screen://";
String options = formatRtpStream("230.0.0.1", 5555);
System.out.println("Streaming '" + media + "' to '" + options + "'");
MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(args);
EmbeddedMediaPlayer mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer();
Canvas canvas = new Canvas();
canvas.setBackground(Color.black);
CanvasVideoSurface videoSurface = mediaPlayerFactory.newVideoSurface(canvas);
mediaPlayer.setVideoSurface(videoSurface);
// Creating a JFrame to display stream (duplicate)
JFrame f = new JFrame("vlcj duplicate output test");
f.add(canvas);
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
mediaPlayer.playMedia(media,
options,
":no-sout-rtp-sap",
":no-sout-standard-sap",
":sout-all",
":sout-keep"
);
// Don't exit
Thread.currentThread().join();
}
private static String formatRtpStream(String serverAddress, int serverPort) {
StringBuilder sb = new StringBuilder(60);
sb.append(":sout=");
// Transcode with codec (mp4v here), 30 FPS, not resized (scale 1), audio disabled (only video).
sb.append("#transcode{vcodec=mp4v,fps=30,scale=1,noaudio}");
// Creating RTP address
sb.append(":rtp{dst=");
sb.append(serverAddress);
sb.append(",port=");
sb.append(serverPort);
// Encapsulation method used for the resulting stream, this option has to be set.
sb.append(",mux=ts}");
return sb.toString();
}
在 window:
中显示结果流
你可以替换这个:
sb.append(":rtp{dst=");
sb.append(",mux=ts}");
由此:
sb.append(":duplicate{dst=display,dst=rtp{dst=");
sb.append(",mux=ts}}");
这样您就可以看到生成的流。
一些有趣的链接:
几天以来,我一直在寻找将 PC 屏幕从 Java 服务器直播到 Android 客户端 的 最佳方式,但我不能'找不到 TCP 套接字的其他方法。 我想将 从 PC 流式传输到 Android 客户端。
现在我只是通过 TCP 套接字发送图像(帧)。它工作正常,但这是缺点:
- 带宽消耗大(通过多个客户端单播)
- 服务器和客户端之间轮换几秒
- 低帧率
我尝试使用 UDP 套接字,但如何处理最大尺寸为 64Ko 的数据包? 最好的解决方案是 UDP 和 multicast 但我在 Android 上读到了一些关于它的问题,这取决于设备。
提前感谢您的回答!
我终于成功地在 Java 服务器
上通过 RTP 流式传输我的电脑屏幕代码:
public static void main(String[] args) throws Exception {
boolean found = new NativeDiscovery().discover();
System.out.println(found);
System.out.println(LibVlc.INSTANCE.libvlc_get_version());
String media = "screen://";
String options = formatRtpStream("230.0.0.1", 5555);
System.out.println("Streaming '" + media + "' to '" + options + "'");
MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(args);
EmbeddedMediaPlayer mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer();
Canvas canvas = new Canvas();
canvas.setBackground(Color.black);
CanvasVideoSurface videoSurface = mediaPlayerFactory.newVideoSurface(canvas);
mediaPlayer.setVideoSurface(videoSurface);
// Creating a JFrame to display stream (duplicate)
JFrame f = new JFrame("vlcj duplicate output test");
f.add(canvas);
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
mediaPlayer.playMedia(media,
options,
":no-sout-rtp-sap",
":no-sout-standard-sap",
":sout-all",
":sout-keep"
);
// Don't exit
Thread.currentThread().join();
}
private static String formatRtpStream(String serverAddress, int serverPort) {
StringBuilder sb = new StringBuilder(60);
sb.append(":sout=");
// Transcode with codec (mp4v here), 30 FPS, not resized (scale 1), audio disabled (only video).
sb.append("#transcode{vcodec=mp4v,fps=30,scale=1,noaudio}");
// Creating RTP address
sb.append(":rtp{dst=");
sb.append(serverAddress);
sb.append(",port=");
sb.append(serverPort);
// Encapsulation method used for the resulting stream, this option has to be set.
sb.append(",mux=ts}");
return sb.toString();
}
在 window:
中显示结果流你可以替换这个:
sb.append(":rtp{dst=");
sb.append(",mux=ts}");
由此:
sb.append(":duplicate{dst=display,dst=rtp{dst=");
sb.append(",mux=ts}}");
这样您就可以看到生成的流。