2017-03-17 22 views
3

我想在最后有一个方法可以将VP9或H.264设置为SDP中的首选视频编解码器。分割SDP(字符串)为m行来改变视频编解码器

所以我希望在我的SDP m行:

m=video 9 UDP/TLS/RTP/SAVPF 96 98 100 102 127 97 99 101 125

我SDP的

控制台日志:

Screenshot of console log

在这种情况下,我会得到并使用VP8( 96)作为视频编解码器而不是VP9(98)。所以我想检查98/VP9是否可以/可用,并且想要将它设置在开始/第一位以实际使用它。

我走到这一步:

if(sdpOrigin == 'local') { 
    let lines = sdp.split('\n').map(l => l.trim()); 
    lines.forEach(function(line) { 
     if (line.indexOf('m=video') === 0) { 
      let parts = line.substr(28); // Should be avoided! 
      let vp9_order = parts.indexOf("98"); 
      let array = parts.split(/\s+/); 
      console.log("array", array); // 96 98 100 102 127 97 99 101 125 
      if (vp9_order > 0) { 
       array.splice(vp9_order, 1); 
       array.unshift("98"); 
      } 
      console.log("array-new", array); // 98 96 100 102 127 97 99 101 125 

      // How do I update my SDP now with the new codec order? 

     } 
    }) 
} 

这种做法在我看来不好的,因为我得到我想要的M线,但我做了修复子在位置“28”,那么这将打破,如果变化之前的事情。

最后我应该有我的SDP下面的“M线”:

m=video 9 UDP/TLS/RTP/SAVPF 98 96 100 102 127 97 99 101 125

有人可以帮我吗?

+0

可否请你让知道是什么规则是?如果一行以'm = video'开始,并且包含带空格的“98”? –

+0

该行必须以“m = video”开头 - 在sdp中只有这样的行。所以我想检查我的字符串中是否有“98”。如果可用,我想检查它是否在第一位,如果不是,我想要做(交换位置)。 – mrks

回答

0

难道这样的:

// Returns a new m= line with the specified codec as the first one. 
function setDefaultCodec(mLine, payload) { 
    var elements = mLine.split(' '); 

    // Just copy the first three parameters; codec order starts on fourth. 
    var newLine = elements.slice(0, 3); 

    // Put target payload first and copy in the rest. 
    newLine.push(payload); 
    for (var i = 3; i < elements.length; i++) { 
    if (elements[i] !== payload) { 
     newLine.push(elements[i]); 
    } 
    } 
    return newLine.join(' '); 
} 
3

你应该先拆用空白行,把它分解成每SDP specification的相应字段:

let fields = line.split(/\s+/); 
if (fields[0] === 'm=video') { 
    let [ type, port, proto, ...formats] = fields; 

    let vp9_order = formats.indexOf("98"); 
    if (vp9_order > 0) { 
     formats.splice(vp9_order, 1); // remove from existing position 
     formats.unshift("98");   // and prepend 
    } 
    line = [ type, port, proto, ...formats].join(' '); 
} 
+0

这就是我的sdp变量的样子:https://abload.de/img/screenshot2017-03-17akhs0y.png 所以当我使用你的代码时,我的formats.includes没有找到“98”,所以没有日志消息。 – mrks

+0

@mrks对,因为98不在列表中? – Alnitak

+0

嗯,你已经完全改变了这个问题:(你的问题不清楚你想要发生什么,如果98没有出现在列表中, – Alnitak