PJSUA2 Java - 如何获得正在进行的Call的AudioMedia

时间:2017-11-24 16:05:35

标签: java sip pjsip pjsua2

我正在使用Java库来处理PJSUA / PJSIP,并且我试图让AudioMedia接听电话,但它无法正常工作。我已经遵循了C ++文档(没有用于回答调用的Java文档),这使我进行了以下实现:

public void onCallMediaState(OnCallMediaStateParam param) {
    CallInfo ci = this.getInfo();

    for(int i = 0; i < ci.getMedia().size(); i++) {
        if(ci.getMedia().get(i).getType() == pjmedia_type.PJMEDIA_TYPE_AUDIO) {

            AudioMedia aum = (AudioMedia) this.getMedia(i);
        }
    }
}

第一部分有效,它在类型为PJMEDIA_TYPE_AUDIO的呼叫信息中找到媒体,如果我检查this.getMedia(i)的类型也是PJMEDIA_TYPE_AUDIO。但是,当我尝试将其强制转换为类型AudioMedia时,它无法投射。

我假设SIP设置的其余部分正常工作,因为当我拨打该号码时,pjsua报告来电并回答它,我只是无法让AudioMedia发送/接收音频。

该文档适用于C ++,但到目前为止,除了这部分Reference here之外,它与Java完全相同。我做错了什么?

2 个答案:

答案 0 :(得分:2)

发现它!

AudioMedia有一个静态方法typecastFromMedia(Media media),用于转换为AudioMedia。我假设这是因为转换必须发生在底层的C ++实现中,所以你不能只进行高级java转换。

工作示例:

public void onCallMediaState(OnCallMediaStateParam param) {
    CallInfo ci = this.getInfo();

    for(int i = 0; i < ci.getMedia().size(); i++) {
        if(ci.getMedia().get(i).getType() == pjmedia_type.PJMEDIA_TYPE_AUDIO) {

            AudioMedia aum = AudioMedia.typecastFromMedia(this.getMedia(i));
        }
    }
}

答案 1 :(得分:0)

您可以使用getAudioMedia()API来获取AudioMedia,这是我的简单onCallMediaState() 使用C ++的SipCall(Call类的子类):

void SipCall::onCallMediaState(OnCallMediaStateParam &prm) {
    this->callInfo = getInfo();
    unsigned media_size = this->callInfo.media.size();
    for (unsigned i = 0; i < media_size; i++) { 
        AudioMedia audioMedia = getAudioMedia(i);
        // do something
        //...
    }
}