当前位置: 首页 > 知识库问答 >
问题:

VLCJ RTP流式客户端

莫英喆
2023-03-14

我正在做一个基于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只是空的。

共有1个答案

范云
2023-03-14

上面显示的代码的问题是服务器的IP地址。客户端将连接到服务器,但VLC不会播放MRL。所以我在网上对Caprica的示例做了一些研究,发现我应该使用一个多播IP地址来与RTP进行流式传输。(例如230.0.0.1)并解决了问题。从客户端进行流式传输时没有问题。

 类似资料:
  • 流程概述 标准的grpc client调用代码,最简单的方式,就三行代码: ManagedChannelImpl channel = NettyChannelBuilder.forAddress("127.0.0.1", 6556).build(); DemoServiceGrpc.DemoServiceBlockingStub stub = DemoServiceGrpc.newBlocking

  • 客户端模块是一个较复杂的模块,这里包含了集群管理、路由、地址管理器、连接管理器、负载均衡器,还与代理、注册中心等模块交互。

  • 问题内容: 我产生了以下孩子:我希望在客户端( 浏览器 )上 一个接一个地 而不是整体接收ping结果。 到目前为止,我已经尝试过了: 然后: 在这两种情况下,浏览器都将等待10次ping操作,然后将结果整体打印出来。我想让他们一个接一个,如何实现呢? (客户只是在拨打电话并用console.log记录结果) 编辑: 尽管我确实相信websockets是实现这一点所必需的,但我只是想知道是否还有其

  • 我有一个在远程服务器(debian linux)上运行的Java应用程序。该应用程序将运行时信息记录到文件中。 偶尔,支持人员需要使用客户端工具(不是在服务器上运行,而是在支持人员的桌面上运行)分析日志。然后,该工具需要远程访问 < li >服务器上的旧日志文件 < li >当前日志文件(实时增长) 我正在搜索一种良好的(=标准,灵活,安全,调试良好等)方式将这些过去和现在的日志消息流式传输到我的

  • 众所周知,Flink有两个核心API(数据流/数据集),但当我使用Flink Sql客户端提交作业时,我不需要选择流或批处理模式。所以,Flink SQL客户机是如何决定使用批处理模式和流模式的。我在官方文件中没有找到答案。所以,我想知道Flink SQL客户端如何区分批处理模式和流模式?

  • 我已经考虑这个问题好几天了,从经验中我知道我通常会解决这些问题,但这次我遇到了砖墙。 我有一个在Azure DevOps YAML管道中实例化的python应用程序。该应用程序调用Azure DevOps REST API来创建存储库 该应用程序使用PAT(个人访问令牌)进行身份验证 我在Azure DevOps中创建了一个应用程序: 我的计划是让这一切都在Postman中工作,然后将我的发现移植