为 m 行拆分 SDP(字符串)以更改视频编解码器
Split SDP (string) for m line to change video codecs
我想在最后有一个方法可以将 VP9 或 H.264 设置为 SDP 中的首选视频编解码器。
所以我在我的 SDP 中寻找 m 行:
m=video 9 UDP/TLS/RTP/SAVPF 96 98 100 102 127 97 99 101 125
我的 SDP 的控制台日志:
在这种情况下,我会获取并使用 VP8 (96) 作为视频编解码器,而不是 VP9 (98)。所以我想检查一下98/VP9是不是possible/available,想把它设置在beginning/first的位置才能真正使用。
到目前为止我得到了什么:
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 line":
m=video 9 UDP/TLS/RTP/SAVPF 98 96 100 102 127 97 99 101 125
有人可以帮我吗?
您应该先用白色 space 拆分该行,以便根据 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(' ');
}
是不是这样的:
// 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(' ');
}
这个方法可以自己修改SDP。您可以修改 SDP 以强制使用 h264、vp9 或 vp8 编解码器。
<script src="https://cdn.webrtc-experiment.com/CodecsHandler.js"></script>
sdp = CodecsHandler.preferCodec(sdp, 'h264');
sdp = CodecsHandler.preferCodec(sdp, 'vp8');
sdp = CodecsHandler.preferCodec(sdp, 'vp9');
我想在最后有一个方法可以将 VP9 或 H.264 设置为 SDP 中的首选视频编解码器。
所以我在我的 SDP 中寻找 m 行:
m=video 9 UDP/TLS/RTP/SAVPF 96 98 100 102 127 97 99 101 125
我的 SDP 的控制台日志:
在这种情况下,我会获取并使用 VP8 (96) 作为视频编解码器,而不是 VP9 (98)。所以我想检查一下98/VP9是不是possible/available,想把它设置在beginning/first的位置才能真正使用。
到目前为止我得到了什么:
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 line":
m=video 9 UDP/TLS/RTP/SAVPF 98 96 100 102 127 97 99 101 125
有人可以帮我吗?
您应该先用白色 space 拆分该行,以便根据 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(' ');
}
是不是这样的:
// 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(' ');
}
这个方法可以自己修改SDP。您可以修改 SDP 以强制使用 h264、vp9 或 vp8 编解码器。
<script src="https://cdn.webrtc-experiment.com/CodecsHandler.js"></script>
sdp = CodecsHandler.preferCodec(sdp, 'h264');
sdp = CodecsHandler.preferCodec(sdp, 'vp8');
sdp = CodecsHandler.preferCodec(sdp, 'vp9');