2012-09-20 54 views
2

我正在開發一個項目,需要實現從服務器上的攝像頭到遠程客戶端上的小程序的實時視頻流。視頻流不能通過互聯網或本地網絡工作

我有過JMF服務器上捕獲從攝像頭實時流&部署流媒體RTP &接收從RTP流的地址然後它發揮到它的小應用程序代碼。

但它只在我自己的電腦(服務器)&內工作的問題不適用於本地網絡(它加載小程序,但不運行視頻播放器)。

服務器代碼:

public class Streaming_Server { 

    /** 
    * @param args the command line arguments 
    */ 
    private static String PORT = "10000"; 
    private static InetAddress addr; 
    static final Format[] FORMATS = { new VideoFormat("rgb") }; 
    static final ContentDescriptor CONTENT_DESCRIPTOR = new ContentDescriptor("raw.rtp"); 

    public static void main(String[] args) throws IOException, NoDataSourceException, NoProcessorException, CannotRealizeException, NoDataSinkException { 
     // TODO code application logic here 
     try 
     { 
      addr = InetAddress.getLocalHost(); 
      String ipAddr = addr.getHostAddress(); 
      String hostname = addr.getHostName(); 
      System.out.println("Your IP is " + ipAddr); 
      System.out.println("Your Host Name is " + hostname); 
     } 
     catch (UnknownHostException e){} 


     CaptureDeviceInfo webcamInfooo = new CaptureDeviceInfo("Camera", new MediaLocator("vfw://0"), null); 
     MediaLocator camDeviceMediaLocator = webcamInfooo.getLocator(); 
     DataSource source = Manager.createDataSource(camDeviceMediaLocator); 
     Processor mediaProcessor = Manager.createRealizedProcessor(new ProcessorModel(source, FORMATS, CONTENT_DESCRIPTOR)); 
     //MediaLocator outputMediaLocator = new MediaLocator("rtp://" + addr.getHostAddress() + ":" + PORT + "/video"); 
     MediaLocator outputMediaLocator = new MediaLocator("rtp://192.168.1.4:20000/video"); 
     DataSink dataSink = Manager.createDataSink(mediaProcessor.getDataOutput(), outputMediaLocator); 

     mediaProcessor.start(); 
     dataSink.open(); 
     dataSink.start(); 
    } 
} 

客戶端代碼:

public class Streaming_Client extends Applet implements ControllerListener { 

    /** 
    * Initialization method that will be called after the applet is loaded into 
    * the browser. 
    */ 
    Player player = null; 
    private MediaLocator mediaLocator; 
    private static String PORT = "10000"; 
    private static InetAddress addr; 

    public void init() { 
     // TODO start asynchronous download of heavy resources 
     //mediaLocator = new MediaLocator("rtp:/192.168.1.4:10000/video"); 
     mediaLocator = new MediaLocator("rtp:/192.168.1.4:20000/video"); 
     setLayout(new BorderLayout()); 
     try { 
      player = Manager.createPlayer(mediaLocator); 
      player.addControllerListener(this); 
     } catch (IOException | NoPlayerException ex) { 
      Logger.getLogger(Streaming_Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void start(){ 
     player.start(); 
    } 

    public void stop(){ 
     player.stop(); 
     player.deallocate(); 
    } 

    public void destroy(){ 
     player.close(); 
    } 
    // TODO overwrite start(), stop() and destroy() methods 

    @Override 
    public void controllerUpdate(ControllerEvent ce) { 
     if ((ce instanceof RealizeCompleteEvent)) 
     { 
     Component comp; 
     if ((comp = this.player.getVisualComponent()) != null) 
      add("Center", comp); 
     if ((comp = this.player.getControlPanelComponent()) != null) 
      add("South", comp); 
     validate(); 
     } 
    } 
} 
+0

確保已打開[Java控制檯](http://www.java.com/en/download/help/javaconsole.xml)並複製/粘貼輸出。我想一些'訪問'相關的異常將在那裏。 –

回答

3

經過一番研究,我發現,在MediaLocator的服務器採用目標IP不是源之一。

這是一件煩人的事情,因爲你必須知道你在哪裏流媒體。

所以,這個編輯後..

CaptureDeviceInfo webcamInfooo = new CaptureDeviceInfo("Camera", new MediaLocator("vfw://0"), null); 
MediaLocator camDeviceMediaLocator = webcamInfooo.getLocator(); 
DataSource source = Manager.createDataSource(camDeviceMediaLocator); 
Processor mediaProcessor = Manager.createRealizedProcessor(new ProcessorModel(source, FORMATS, CONTENT_DESCRIPTOR)); 
//MediaLocator outputMediaLocator = new MediaLocator("rtp://" + addr.getHostAddress() + ":" + PORT + "/video"); 
MediaLocator outputMediaLocator = new MediaLocator("rtp://192.168.1.6:20000/video"); 
DataSink dataSink = Manager.createDataSink(mediaProcessor.getDataOutput(), outputMediaLocator); 

我可以實時視頻流從192.168.1.4到捕捉192.168.1.6在聯網只。

但我找不到到現在如何流在互聯網上,因爲我必須分配遠程pc ip。

+0

有沒有什麼辦法可以避免分配目標ip,因爲我想發佈小程序? –