2015-11-05 4 views
1

Я делаю проект, основанный на потоковой передаче VLCJ. Я просмотрел учебник VLCJ о том, как создать серверную часть из приведенного ниже кода. Как клиент получит видеоконтент с сервера? Я также написал код клиента, но он ничего не отображает.VLCJ RTP Потоковая клиентская сторона

Любая помощь будет оценена по достоинству. Спасибо.

Серверный код:

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 просто пуст.

+0

Каков фактический MRL, который вы играете в своем клиенте? – caprica

+0

Привет. Спасибо за ответ. Чем реальный MRL в моем клиенте rtp: //@192.168.1.104: 55555. Я запустил клиент с другого компьютера, и он дал мне эту ошибку: «open of» rtp: //@192.168.1.104: 55555 «не удалось». и VLC не может открыть MRL «rtp: //@192.168.1.104: 55555». Любые предложения, пожалуйста. Спасибо. – khalidcawl

+0

Ваш исходный вопрос имеет 5555 как «общественный» порт, а не 55555 в соответствии с вашим комментарием. – caprica

ответ

0

Проблема, с которой я столкнулся с приведенным выше кодом, - это IP-адрес сервера. Клиент будет подключаться к серверу, но VLC не будет воспроизводить MRL. Поэтому я провел несколько исследований по примерам caprica в Интернете и обнаружил, что я должен использовать IP-адрес многоадресной передачи для потока с RTP. (например, 230.0.0.1), и проблема решена. Потоковая передача с клиентской стороны возникла без проблем.

Смежные вопросы