2014-01-28 69 views

回答

7

一般來說,是的。以下是建立連接期間如何選擇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; 
}; 
+1

非常感謝這個偉大的代碼。你能否以簡單的英文詳細說明你想要達到的目標? –

+0

@AdrianBer的主要思想是採取SDP數據包並以這種方式更改相應的字段,以便您希望默認使用的編解碼器在可用編解碼器列表中相互出現在彼此之前。 – fycth

+0

因此,您幾乎可以找到opus編解碼器的有效載荷,並將其作爲第三個元素(這是首選項中的第一個編解碼器)添加到以「m = audio」開頭的行中。你爲什麼還要刪除CN行?順便說一句,是一個文件解釋sdp字符串的格式? –

相關問題