在設(shè)置setRemoteDescription時(shí)可能會出現(xiàn)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=)后面可以跟任意數(shù)量的 a= 字段,對媒體描述進(jìn)行擴(kuò)展。==
具體可以自行搜索WebRTC sdp 協(xié)議。
出現(xiàn)這問題的原因可能是:
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數(shù)量不一樣或不一致。
第二種情況不做過多闡述,可以很直接的看出來。
重點(diǎn)看一下第一種情況:
| offer sdp | answer sdp |
|---|---|
offer sdp
|
anser sdp
|
這里就可以看出來在offer sdp 和 anser sdp 中 m=video 和 m=video 是反的。所以要調(diào)換一下answer sdp 中 m=video 和 m=video 的順序,保證和 answer sdp 一致。
調(diào)換時(shí),不能單調(diào)換 m= 這一行,一段完整的是一個 m= 開始,到另一個 m= 開始(或結(jié)束)才是一個完整的。
貼一下示例代碼:
/**
* 轉(zhuǎn)換AnswerSdp
* @param offerSdp offerSdp:創(chuàng)建offer時(shí)生成的sdp
* @param answerSdp answerSdp:網(wǎng)絡(luò)請求srs服務(wù)器返回的sdp
* @return 轉(zhuǎn)換后的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 {
//需要調(diào)換順序
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()調(diào)用順序會影響到生成sdp信息中video、audio信息順序,如果用到addTransceiver(),調(diào)整調(diào)用順序應(yīng)該也可以解決這個問題。
如有錯誤歡迎指正。