2013-02-21 21 views
1

我正在使用java應用程序與使用JAIN SIP java API的細微語音服務器建立SIP會話。然後,我通過發送一些MRCP命令(如GET_PARAMS,SET-PARAMS,Define Grammar &)來識別使用mrcp4j API來設置識別系統。如何使用Java Media Framework(JMF)發送rtcp bye消息?

然後我用JMF api設置一個rtp & rtcp會話與語音服務器發送音頻進行識別。服務器已收到音頻,但在收到RTCP再見之前它不會識別。

但問題是我不能使用rtcp bye結束rtp會話,因爲我無法找出JMF文檔中的方法

如果有人能指導我,那將會非常有幫助。我附上了RTP會話的代碼。

鏈接,JMF API文檔here

// send Audio data 
// create the RTP Manager 
RTPManager rtpManager = RTPManager.newInstance(); 

// create the local endpoint for the local interface on any local port 
int port = Integer.parseInt(rtpPORT);; 
SessionAddress localAddress = new SessionAddress();  
InetAddress IP = InetAddress.getByName("hydhtc284704d"); 
localAddress.setControlHostAddress(IP); 
localAddress.setControlPort(24501); 
localAddress.setDataHostAddress(IP); 
localAddress.setDataPort(24500); 

// initialize the RTPManager 
rtpManager.initialize(localAddress); 
//rtpManager.initialize(rtpConnector); 

// specify the remote endpoint of this unicast session 
InetAddress ipAddress = InetAddress.getByName("hydhtc227033d"); 
SessionAddress remoteAddress = new SessionAddress(ipAddress, port, ipAddress, port + 1); 

//System.out.println(remoteAddress); 
// open the connection 
rtpManager.addTarget(remoteAddress); 

rtpManager.addSendStreamListener(new SendStreamListener() { 
@Override 
public void update(SendStreamEvent arg0) { 
//System.out.println("Send Stream Event: " + arg0.getSource()); 
System.out.println("Number of bytes transmitted: " + arg0.getSendStream().getSourceTransmissionStats().getBytesTransmitted()); 
System.out.println("Sender Report: " + arg0.getSendStream().getSenderReport()); 
} 
}); 

rtpManager.addReceiveStreamListener(new ReceiveStreamListener() { 
@Override 
public void update(ReceiveStreamEvent arg0) { 
// TODO Auto-generated method stub 
} 
}); 


File audioFile = new File("C:\\Users\\Bhanu_Verma\\Desktop\\eclipse\\one.wav"); 
Processor processor= Manager.createProcessor(audioFile.toURI().toURL()); 
processor.configure(); 
// Block until the Processor has been configured 

while (processor.getState() != processor.Configured) { 
} 

processor.setContentDescriptor(new ContentDescriptor(ContentDescriptor.RAW_RTP)); 

TrackControl track[] = processor.getTrackControls(); 
//ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP); 
//processor.setContentDescriptor(cd); 
boolean encodingOk = false; 
// Go through the tracks and try to program one of them to 
// output ulaw data. 

    for (int i = 0; i < track.length; i++) { 
     if (!encodingOk && track[i] instanceof FormatControl) { 
      if (((FormatControl)track[i]).setFormat(new AudioFormat(AudioFormat.ULAW_RTP,8000,8,1)) == null) 
      { 
       track[i].setEnabled(false); 
      } 
      else 
      { 
       encodingOk = true; 
      } 
     } 
     else 
     { 
      // we could not set this track to ulaw, so disable it 
      track[i].setEnabled(false); 
     } 
    } 

    // At this point, we have determined where we can send out ulaw data or not. 
    // realize the processor 

    if (encodingOk) { 
     processor.realize(); 
     // block until realized. 

     while (processor.getState() != processor.Realized) { 
     } 

     // get the output datasource of the processor and exit if we fail 
     DataSource dataOutput = processor.getDataOutput(); 

     // create a send stream for the output data source of a processor and start it 

     SendStream sendStream = rtpManager.createSendStream(dataOutput,0); 
     sendStream.start(); 

     System.out.println("Starting processor" + "\n"); 
     processor.start(); 


     while(processor.getState()== processor.Started) 
     { 
      System.out.println("Sending Audio.."); 
     } 

     System.out.println("Processor was started and audio was sent to server"); 

     Wait(2000); // waiting so that audio could be given to the server 


     // close the connection if no longer needed. 
     rtpManager.removeTarget(remoteAddress, "Client disconnected."); 

     // call dispose at the end of the life-cycle of this RTPManager so 
     // it is prepared to be garbage-collected. 
     rtpManager.dispose(); 

回答

1

那麼有發送使用JMF的RTCP再見沒有這樣明確的方法。但是,當關閉SendStream時,JMF內部發送RTCP再見。

請注意,關閉和停止SendStream是不同的。關閉流會刪除會話,而停止SendStream只會停止數據傳輸。要發送RTCP再見,只需停止處理器並在完成發送媒體後關閉SendStream。 所以要發送一個RTCP再見,只需將這兩行添加到您的代碼。

processor.stop(); //processor needs to be stopped as well before closing the sendStream 
sendStream.close();