pjsua 如何在呼叫前更新rtpmap 参数
时间: 2024-09-24 11:17:42 浏览: 28
PJSUA开发文档中文版
PJSUA是一款开源的VoIP库,用于实现实时通信(RTC)应用,包括SIP电话。在使用PJSUA时,RTPmap参数是在会话描述符(Session Description)中定义媒体格式的,它包含了编码、采样率等信息。在发起呼叫前更新RTPmap,通常需要在设置会话描述符时进行修改。
以下是基本步骤:
1. **创建会话**:首先,你需要通过`pjmedia_endpt_create()`函数创建一个媒体端点(Media Endpoint),并获取一个会话描述符(Session Description Handler, SDH)。
```cpp
pjmedia_endpt *endpt = pjmedia_endpt_create();
pjmedia_sdp_session_desc *sdesc = NULL;
```
2. **解析SDP**:如果你已经有了一个SDP描述,可以使用`pjmedia_sdp_parse()`解析它。然后,你可以查找或添加所需的RTPmap描述。
```cpp
if (pjmedia_sdp_parse(sdp_str, &sdesc)) {
// 处理错误...
}
```
3. **更新RTPmap**:找到或创建对应的媒体描述(Media Description),然后添加或修改RTPmap。例如,如果你想将AAC编码添加到会话中,可以用以下方式:
```cpp
pjmedia_mediasession_description_media *audio_md = pjmedia_sdp_media_find_by_name(sdesc->medias, "audio");
pjmedia_rtp_format fmt;
// 创建新的RTPmap描述
fmt.type = PJMEDIA_TYPE_RTP_AAC_EMERGENCY;
fmt.payload_type = ...; // 设置合适的payload type
fmt.clock_rate = ...; // 编码速率
fmt.name = "AAC"; // 音频类型名称
pjmedia_sdp_add_rtpmap(audio_md->rtpmap, fmt);
```
4. **设置会话**:最后,将修改后的SDH设置给会话:
```cpp
pj_status_t status = pjmedia_endpt_set_snd_transport(endpt, sdesc);
if (status != PJ_SUCCESS) {
// 处理错误...
}
```
5. **发起呼叫**:现在你可以使用`pjmedia_endpt_call()`来发起呼叫了,RTPmap已经按照你的配置进行了更新。
阅读全文