Java 音频文件播放完毕后挂断SIP呼叫

Java 音频文件播放完毕后挂断SIP呼叫,java,multithreading,audio,sip,rtp,Java,Multithreading,Audio,Sip,Rtp,我正在使用来实现SIP用户代理。由于同行的演示源代码和项目文档,大部分工作已经完成 但是,我在实现以下功能时遇到了一些问题:在源(预录制)音频文件播放完毕后终止呼叫 这种特性在默认情况下不可用,所以我正在编辑peers lib项目来实现它。特别是,我目前正在处理,我不明白在从PipedInputStream encodedData读取所有数据之后,run方法似乎是如何停止/等待的 首先,我简单地想到了主while循环: while(!isStopped){ numBytesRead =

我正在使用来实现SIP用户代理。由于同行的演示源代码和项目文档,大部分工作已经完成

但是,我在实现以下功能时遇到了一些问题:在源(预录制)音频文件播放完毕后终止呼叫

这种特性在默认情况下不可用,所以我正在编辑peers lib项目来实现它。特别是,我目前正在处理,我不明白在从PipedInputStream encodedData读取所有数据之后,run方法似乎是如何停止/等待的

首先,我简单地想到了主while循环:

while(!isStopped){
    numBytesRead = 0;
    [...]
}
,在run方法中,当从上述PipedInputStream读取所有数据时结束,但情况似乎并非如此,因为我在循环结束后放置了System.out.println()istruction,它从未执行过

然而,while循环以某种方式暂停/结束,因为我在循环中放置了另一条System.out.println()指令,在从PipedInputStream读取最后一个字节后,该指令停止执行

因此,我认为它一定与运行代码的线程有关,但我找不到任何对sleep()/join()调用的引用,而只是对CaptureRtpSender类中的start()调用的引用:

[...]
public void start() throws IOException{
    [...]
    rtpSender.setStopped(false);`
    [...]
    Thread rtpSenderThread = new Thread(rtpSender, RtpSender.class.getSimpleName());
    [...]
    rtpSenderThread.start();
}
[...]
我认为理解读取所有数据时线程如何停止可能是解决问题的关键,因为我可以复制该方法来指示主类终止调用

提前感谢您的帮助