Лучший способ транслировать потоковое видео с сервера Java на клиент Android?

Несколько дней я искал лучший способ прямой трансляции экрана ПК с Java-сервера на Android-клиент, но не могу найти другого способа TCP-сокета. Я хочу транслировать с ПК на клиент Android.

Пока я просто отправляю изображения (кадры) через сокеты TCP. Работает нормально, но вот минусы:

  • большое потребление полосы пропускания (одноадресная передача через несколько клиентов)
  • сдвиг в несколько секунд между сервером и клиентом
  • низкая частота кадров

Я пытался использовать сокет UDP, но как быть с максимальным размером пакета 64Ko? Лучшим решением будет UDP с многоадресной рассылкой, но я читал некоторые проблемы с этим на Android, которые зависят от устройства.

Заранее спасибо за ответы!


person HJerem    schedule 03.11.2015    source источник
comment
Этот вопрос не является дубликатом.   -  person HJerem    schedule 03.11.2015


Ответы (1)


Наконец-то мне удалось показать экран моего ПК через RTP на Java-сервере

Код:

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

Таким образом, вы сможете увидеть результирующий поток.


Несколько интересных ссылок:

person HJerem    schedule 03.11.2015