Android-WebRTC

Failed to set remote answer sdp:

2021-09-19  本文已影响0人  冬季穿短裤

在设置setRemoteDescription时可能会出现Failed to set remote answer sdp: The order of m-lines in answer doesn't match order in offer. Rejecting answer.这个问题。

大概说一下sdp:

m-lines:sdp中媒体描述,比如video、audio,可能有多个。
==媒体描述(m=)后面可以跟任意数量的 a= 字段,对媒体描述进行扩展。==
具体可以自行搜索WebRTC sdp 协议

出现这问题的原因可能是:

1、offer sdp中m=xxx和answer sdp中m=xxx顺序不对,大概意思就是 offer sdp 中比如第一个顺序是m=video,但是answer sdp 中第一个是m=audio
2、offer sdp中m=xxx和answer sdp中m=xxx数量不一样或不一致。

第二种情况不做过多阐述,可以很直接的看出来。
重点看一下第一种情况:

offer sdp answer sdp
offer sdp anser sdp

这里就可以看出来在offer sdpanser sdpm=videom=video 是反的。所以要调换一下answer sdpm=videom=video 的顺序,保证和 answer sdp 一致。

调换时,不能单调换 m= 这一行,一段完整的是一个 m= 开始,到另一个 m= 开始(或结束)才是一个完整的。

贴一下示例代码:

/**
 * 转换AnswerSdp
 * @param offerSdp offerSdp:创建offer时生成的sdp
 * @param answerSdp answerSdp:网络请求srs服务器返回的sdp
 * @return 转换后的AnswerSdp
 */
private fun convertAnswerSdp(offerSdp: String, answerSdp: String?): String {
    if (answerSdp.isNullOrBlank()){
        return ""
    }
    val indexOfOfferVideo = offerSdp.indexOf("m=video")
    val indexOfOfferAudio = offerSdp.indexOf("m=audio")
    if (indexOfOfferVideo == -1 || indexOfOfferAudio == -1) {
        return answerSdp
    }
    val indexOfAnswerVideo = answerSdp.indexOf("m=video")
    val indexOfAnswerAudio = answerSdp.indexOf("m=audio")
    if (indexOfAnswerVideo == -1 || indexOfAnswerAudio == -1) {
        return answerSdp
    }

    val isFirstOfferVideo = indexOfOfferVideo < indexOfOfferAudio
    val isFirstAnswerVideo = indexOfAnswerVideo < indexOfAnswerAudio
    return if (isFirstOfferVideo == isFirstAnswerVideo) {
        //顺序一致
        answerSdp
    } else {
        //需要调换顺序
        buildString {
            append(answerSdp.substring(0, indexOfAnswerVideo.coerceAtMost(indexOfAnswerAudio)))
            append(
                answerSdp.substring(
                    indexOfAnswerVideo.coerceAtLeast(indexOfOfferVideo),
                    answerSdp.length
                )
            )
            append(
                answerSdp.substring(
                    indexOfAnswerVideo.coerceAtMost(indexOfAnswerAudio),
                    indexOfAnswerVideo.coerceAtLeast(indexOfOfferVideo)
                )
            )
        }
    }
}

如有错误欢迎指正。

上一篇下一篇

猜你喜欢

热点阅读