3

我正在为 PJSUA / PJSIP 使用 Java 库,并且我正在尝试获取 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++,但到目前为止,它与 Java 完全相同,除了这部分,参考这里。我究竟做错了什么?

4

2 回答 2

3

找到了!

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));
        }
    }
}
于 2017-11-24T16:45:36.637 回答
-1

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

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
        //...
    }
}
于 2019-08-01T02:57:35.617 回答