VLCJ RTP 流客户端

VLCJ RTP Streaming client side

我正在做一个基于 VLCJ 流的项目。我已经查阅了关于如何从下面的代码创建服务器端的 VLCJ 教程。客户端如何从服务器获取视频内容?我也编写了客户端代码,但它没有显示任何内容。

如有任何帮助,我们将不胜感激。谢谢你。

服务器代码:

package com.khalid.VideoStreaming;

import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.headless.HeadlessMediaPlayer;


public class PublicServer extends VlcjTest{
public static void main(String[] args) throws Exception {
    if (args.length != 1) {
        System.out.println("Specify a single MRL to stream");
        System.exit(1);
    }

    String media = args[0];
    //String publicIP = "192.168.0.255";
    String publicIP = "192.168.1.104";
    short publicPort = 5555;
    String options = formatRtpStream(publicIP, publicPort);

    System.out.println("Streaming '" + media + "' to '" + options + "'");

    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(args);
    HeadlessMediaPlayer mediaPlayer = mediaPlayerFactory.newHeadlessMediaPlayer();

    mediaPlayer.playMedia(media, options, ":no-sout-rtp-sap", ":no-sout-standard-sap", ":sout-all", ":sout-keep");

    Thread.currentThread().join(); // Don't exit
}

private static String formatRtpStream(String serverAddress, short serverPort) {

    StringBuilder sb = new StringBuilder(200);
    //sb.append(":sout=#transcode{acodec=mp4a,samplerate=12000,width=400,height=300}:rtp{dst=");
    //sb.append("::sout=#transcode{vcodec=mp4v,vb=4096,scale=1,fps=30,acodec=mpga,ab=128,channels=2,samplerate=44100,width=800,height=600}:rtp:duplicate{dst=file{dst=");
    sb.append("::sout=#transcode{vcodec=mp4v,vb=3000,fps=30,scale=1,acodec=mp4a,ab=128,channels=2,samplerate=48000,width=800,height=600}:rtp{dst=");

    sb.append(serverAddress);
    sb.append(",port=");
    sb.append(serverPort);
    sb.append(",mux=ts}");
    return sb.toString();
}

}

客户端:

String mediatorIP = "192.168.1.104"; short mediatorPort = 6001;
String publicIP, publicServer, localIP, localServer, clientIP;
short publicPort, localPort;

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

JFrame f = new JFrame();
//f.setIconImage(new ImageIcon(Client.class.getResource("icons/vlcj-logo.png")).getImage());
f.add(canvas);
f.setSize(800, 600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
publicIP = inFromServer.readLine(); // Recv public server's ip from mediator
publicPort = Short.parseShort(inFromServer.readLine()); // Recv public server's port from mediator
publicServer = formatRtpStream(publicIP, publicPort);
System.out.println("Capturing from '" + publicServer + "'");
f.setTitle("Capturing from Public Server 'rtp://" + publicIP + ":" + publicPort + "'");
mediaPlayer.playMedia(publicServer);

正如您在上面看到的,mediaPlayer.playMedia(publicServer) 应该正在显示视频内容,但没有显示任何内容。 JFrame 是空的。

我在上面显示的代码中遇到的问题是服务器的 IP 地址。客户端将连接到服务器,但 VLC 不会播放 MRL。因此,我对 caprica 的在线示例进行了一些研究,发现我应该使用多播 IP 地址通过 RTP 进行流式传输。 (例如 230.0.0.1),问题得到解决。从客户端流式传输没有问题。