【问题标题】:Best way to live stream video from java server to android client? [duplicate]将视频从 java 服务器直播到 android 客户端的最佳方式? [复制]
【发布时间】:2026-01-18 09:30:01
【问题描述】:

几天以来,我一直在寻找将 PC 屏幕从 Java 服务器实时流式传输到 Android 客户端的最佳方式,但我找不到其他方式 TCP 插座。 我想将从 PC 流式传输到 Android 客户端。

现在我只是通过 TCP 套接字发送图像(帧)。它工作正常,但有以下缺点:

  • 大带宽消耗(通过多个客户端单播)
  • 服务器和客户端之间的几秒转换
  • 低帧率

我尝试使用 UDP 套接字,但如何处理最大大小为 64Ko 的数据包? 最好的解决方案是 UDPmulticast,但我在 Android 上读到了一些关于它的问题,这取决于设备。

提前感谢您的回答!

【问题讨论】:

  • 这个问题不是重复的。

标签: java vlc multicast live-streaming vlcj


【解决方案1】:

我终于成功在 Java 服务器上通过 RTP 流式传输我的 PC 屏幕

代码:

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

在窗口中显示结果流:

你可以替换这个:

sb.append(":rtp{dst=");
sb.append(",mux=ts}");

通过这个:

sb.append(":duplicate{dst=display,dst=rtp{dst=");
sb.append(",mux=ts}}");

这样您就可以看到生成的流。


一些有趣的链接:

【讨论】:

    最近更新 更多