在设置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 中 m=video 和 m=video 是反的。所以要调换一下answer sdp 中 m=video 和 m=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)
)
)
}
}
}
这里提一下,addTransceiver()调用顺序会影响到生成sdp信息中video、audio信息顺序,如果用到addTransceiver(),调整调用顺序应该也可以解决这个问题。
如有错误欢迎指正。