jssip修改SDP优先VP8

在使用Freeswitch会议融屏的时候,画面有时候会偏色,感觉编解码少了通道,整体会偏紫;怀疑是mp4的编解码可能有问题,后续改成优先VP8,感觉在使用的时候会减少类似情况;

找到暴露的位置
UA.on('newRTCSession', (res) => {
    let { session, originator } = res;
    session.on('sdp', (event) => {
        // sdp一定要判断type是'offer'的时候去修改;
        if (event.type === 'offer') {
            let sdp = event.sdp;
            // 修改SDP优先匹配VP8
            sdp =  SDPPrioritizeCodec(sdp, 'VP8');
            event.sdp = sdp;
        };
    });
})
封装修改SDP方法
/* 调用 SDPPrioritizeCodec(sdp, 'VP8'); */
export function SDPPrioritizeCodec(sdp, preferredCodec) {
    const codecRegex = /a=rtpmap:(\d+) (\w+)/g;
    let codecPayloads = {};
    let sdpLines = sdp.split('\r\n');
    let mLineIndex = -1;

    // 遍历SDP的每一行,找到codec的payload types
    sdpLines.forEach((line, index) => {
        if (line.startsWith('m=video')) {
            mLineIndex = index;
        }
        let match = codecRegex.exec(line);
        while (match) {
            codecPayloads[match[2]] = match[1];
            match = codecRegex.exec(line);
        }
    });

    // 如果找到了m=video行
    if (mLineIndex !== -1) {
        let mLineParts = sdpLines[mLineIndex].split(' ');
        let payloadList = mLineParts.slice(3); // 去掉m=video和端口号部分,只保留payload types
        
        let preferredPayload = codecPayloads[preferredCodec];
        let updatedPayloadList = payloadList.filter(p => p !== preferredPayload); // 删除优先编解码器,准备重新排序
        
        if (preferredPayload) {
            // 将优先的编解码器Payload放在最前面
            updatedPayloadList.unshift(preferredPayload);
            // 重新构建m=video行
            mLineParts = mLineParts.slice(0, 3).concat(updatedPayloadList);
            sdpLines[mLineIndex] = mLineParts.join(' ');
        }
    }

    return sdpLines.join('\r\n');
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pion WebRTC提供了一种方便的方式来修改SDP(Session Description Protocol),以实现对媒体协商的控制。下面是一些修改SDP的方法: 1. 修改SDP中的音频和视频编码:通过修改SDP中的"m="行可以更改音频和视频的编码协议、传输协议和端口号。例如,你可以使用"opus"代替"PCMU"来更改音频编码。 2. 修改SDP中的带宽限制:通过修改SDP中的"b="行可以更改媒体流的带宽限制。例如,你可以将音频流的带宽限制从128kbps降低到64kbps。 3. 修改SDP中的ICE候选地址:通过修改SDP中的"a=candidate"行可以更改ICE候选地址。例如,你可以将ICE候选地址从IPv4更改为IPv6。 4. 修改SDP中的DTLS加密参数:通过修改SDP中的"a=setup"和"a=fingerprint"行可以更改DTLS加密参数。例如,你可以将DTLS加密模式从"actpass"更改为"active"。 5. 修改SDP中的会话属性:通过修改SDP中的"a=group"和"a=mid"行可以更改会话属性。例如,你可以将音频流和视频流分别分组并分配唯一的ID。 要修改SDP,你可以使用以下代码片段作为参考: ``` // 获取本地SDP offer := webrtc.SessionDescription{} err = json.Unmarshal([]byte(sdp), &offer) if err != nil { fmt.Println(err) return } // 修改SDP offer.SDP = strings.Replace(offer.SDP, "PCMU", "opus", -1) offer.SDP = strings.Replace(offer.SDP, "a=mid:0", "a=mid:audio", -1) offer.SDP = strings.Replace(offer.SDP, "a=mid:1", "a=mid:video", -1) // 创建应答 answer, err := peerConnection.CreateAnswer(nil) if err != nil { fmt.Println(err) return } // 设置本地SDP err = peerConnection.SetLocalDescription(answer) if err != nil { fmt.Println(err) return } // 发送应答SDP给远端 sendSDP(answer) ``` 这段代码将本地SDP中的"PCMU"替换为"opus",并将音频流和视频流分别分配唯一的ID。请根据你的具体应用场景进行修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值