2017-03-17 2 views
3

Je veux avoir une méthode à la fin qui peut définir VP9 ou H.264 comme codec vidéo préféré dans un SDP.Diviser SDP (chaîne de caractères) pour que m ligne change de codecs vidéo

Je suis à la recherche de la ligne m dans mon SDP:

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

journal de la console de mon SDP:

Screenshot of console log

Dans ce cas, j'obtenir et utiliser VP8 (96) en tant que codec vidéo au lieu de VP9 (98). Donc, je veux vérifier si 98/VP9 est possible/disponible et que je veux le définir au début/première position pour l'utiliser réellement.

Ce que je me suis tellement loin:

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? 

     } 
    }) 
} 

Cette approche est mauvaise à mon avis, parce que je reçois ma ligne désirée m mais je fais une sous-chaîne fixe à la position « 28 », il se brisera si quelque chose avant les changements.

A la fin je devrais avoir le suivant "ligne m" dans mon SDP:

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

quelqu'un peut me aider?

+0

Pouvez-vous s'il vous plaît faire savoir ce que le la règle est? Si une ligne commence par 'm = video' et contient' 98' avec des espaces? –

+0

La ligne doit commencer par "m = video" - il n'y a qu'une ligne comme celle-ci dans le sdp. Donc je veux vérifier si "98" est disponible dans ma chaîne. Si c'est disponible, je veux vérifier si c'est en premier lieu, si ce n'est pas le cas, je veux le faire (permuter les lieux). – mrks

Répondre

0

Est-ce comme ça:

// 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

Vous devez diviser la ligne par un espace blanc d'abord, de le casser dans les champs appropriés par la 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

Voici à quoi ressemble ma variable sdp: https://abload.de/img/screenshot2017-03-17akhs0y.png Donc quand j'utilise votre code, je formats.includes ne trouve pas "98" donc pas de message de journal. – mrks

+0

@mrks droite, puisque 98 n'est pas dans la liste? – Alnitak

+0

Ah, vous avez complètement changé la question :(Votre question n'est pas claire sur ce que vous voulez faire si 98 n'apparaît pas du tout dans la liste – Alnitak