简体   繁体   English

如何使用Java Media Framework(JMF)发送rtcp再见消息?

[英]How to send rtcp bye message using Java Media Framework (JMF)?

I am using a java application to set up a SIP session with nuance speech server using JAIN SIP java API. 我正在使用Java应用程序使用JAIN SIP Java API与nuance语音服务器建立SIP会话。 Then I prepared the system for recognition by setting it up by sending some MRCP commands like GET_PARAMS, SET-PARAMS, Define Grammar & recognize using mrcp4j API. 然后,我通过发送一些MRCP命令(例如GET_PARAMS,SET-PARAMS,Define Grammar和使用mrcp4j API进行识别)来设置系统,以进行识别。

Then I used JMF api to set up a rtp & rtcp session with speech server to send the audio for recognition. 然后,我使用JMF api与语音服务器建立rtp和rtcp会话,以发送音频进行识别。 Server has received the audio but it won't recognize until it has received a RTCP bye. 服务器已接收到音频,但直到接收到RTCP再见后才能识别。

But the problem is I am not able to end the rtp session using rtcp bye as I am not able to figure out a method for that in JMF documentation . 但是问题是我无法使用rtcp bye结束rtp会话,因为我无法在JMF文档中找到解决该问题的方法

It would be really helpful if someone could guide me on that. 如果有人可以指导我,那将真的很有帮助。 I have attached the code for the RTP session. 我已经附上了RTP会话的代码。

Link for JMF api documentation is here JMF api文档的链接在这里

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

Well there is no such explicit method for sending the rtcp bye using JMF. 嗯,没有使用JMF来发送rtcp bye的明确方法。 But instead JMF internally sends the RTCP bye when you close your SendStream. 但是,当您关闭SendStream时,JMF会在内部发送RTCP再见。

Please notice that closing and stopping the SendStream is different. 请注意, 关闭和停止SendStream是不同的。 Closing the stream removes the session whereas stopping the SendStream only stops the data transmission. 关闭流将删除会话,而停止SendStream仅会停止数据传输。 To send the RTCP bye just stop the processor and close the SendStream when you are done sending the media. 要发送RTCP再见,只需在完成发送媒体后停止处理器并关闭SendStream。 So to send a RTCP bye just add these two lines to your code. 因此,要发送RTCP再见,只需将这两行添加到您的代码中。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM