3
嘿,我想知道在WebRTC中創建報價/回答時是否有任何方式選擇編解碼器。目前沒有多少視頻編解碼器可供選擇,但有Opus,PCMU,PCMA等音頻編解碼器。有沒有辦法在WebRTC PeerConnection中選擇編解碼器?
嘿,我想知道在WebRTC中創建報價/回答時是否有任何方式選擇編解碼器。目前沒有多少視頻編解碼器可供選擇,但有Opus,PCMU,PCMA等音頻編解碼器。有沒有辦法在WebRTC PeerConnection中選擇編解碼器?
一般來說,是的。以下是建立連接期間如何選擇Opus編解碼器的示例。 您應該從createAnswer或createOffer的回調函數中調用'preferOpus'。
var preferOpus = function(sdp) {
var sdpLines = sdp.split('\r\n');
for (var i = 0; i < sdpLines.length; i++) {
if (sdpLines[i].search('m=audio') !== -1) {
var mLineIndex = i;
break;
}
}
if (mLineIndex === null) return sdp;
for (i = 0; i < sdpLines.length; i++) {
if (sdpLines[i].search('opus/48000') !== -1) {
var opusPayload = extractSdp(sdpLines[i], /:(\d+) opus\/48000/i);
if (opusPayload)
sdpLines[mLineIndex] = setDefaultCodec(sdpLines[mLineIndex], opusPayload);
break;
}
}
sdpLines = removeCN(sdpLines, mLineIndex);
sdp = sdpLines.join('\r\n');
return sdp;
};
var extractSdp = function(sdpLine, pattern) {
var result = sdpLine.match(pattern);
return (result && result.length == 2)? result[1]: null;
};
var setDefaultCodec = function(mLine, payload) {
var elements = mLine.split(' ');
var newLine = new Array();
var index = 0;
for (var i = 0; i < elements.length; i++) {
if (index === 3) newLine[index++] = payload;
if (elements[i] !== payload) newLine[index++] = elements[i];
}
return newLine.join(' ');
};
var removeCN = function(sdpLines, mLineIndex) {
var mLineElements = sdpLines[mLineIndex].split(' ');
for (var i = sdpLines.length-1; i >= 0; i--) {
var payload = extractSdp(sdpLines[i], /a=rtpmap:(\d+) CN\/\d+/i);
if (payload) {
var cnPos = mLineElements.indexOf(payload);
if (cnPos !== -1) mLineElements.splice(cnPos, 1);
sdpLines.splice(i, 1);
}
}
sdpLines[mLineIndex] = mLineElements.join(' ');
return sdpLines;
};
非常感謝這個偉大的代碼。你能否以簡單的英文詳細說明你想要達到的目標? –
@AdrianBer的主要思想是採取SDP數據包並以這種方式更改相應的字段,以便您希望默認使用的編解碼器在可用編解碼器列表中相互出現在彼此之前。 – fycth
因此,您幾乎可以找到opus編解碼器的有效載荷,並將其作爲第三個元素(這是首選項中的第一個編解碼器)添加到以「m = audio」開頭的行中。你爲什麼還要刪除CN行?順便說一句,是一個文件解釋sdp字符串的格式? –