Javascript 如何为高质量Opus音频设置SDP

Javascript 如何为高质量Opus音频设置SDP,javascript,audio,webrtc,sdp,opus,Javascript,Audio,Webrtc,Sdp,Opus,我一直在尝试通过WebRTC传输一些高质量的音频流。Opus,主要的广告编解码器似乎很完美,因为它可以支持高达510kbit/s的速度,远远超过需要。 问题是,设置Webrtc SDP并不像看上去那么明显。多亏了Muaz Khan的出色工作,我才能够将其强制到128kbit/s。 基本上,代码如下所示: function setBandwidth(sdp) { var sdpLines = sdp.split('\r\n'); // Find opus payload. var opus

我一直在尝试通过WebRTC传输一些高质量的音频流。Opus,主要的广告编解码器似乎很完美,因为它可以支持高达510kbit/s的速度,远远超过需要。 问题是,设置Webrtc SDP并不像看上去那么明显。多亏了Muaz Khan的出色工作,我才能够将其强制到128kbit/s。 基本上,代码如下所示:

 function setBandwidth(sdp) {
 var sdpLines = sdp.split('\r\n');


// Find opus payload.
var opusIndex = findLine(sdpLines, 'a=rtpmap', 'opus/48000');
var opusPayload;
if (opusIndex) {
    opusPayload = '109';
}
sdpLines[opusIndex]='a=rtpmap:'+opusPayload+' opus/48000/2';


   var mediaIndex = findLine(sdpLines, 'm=audio');
sdpLines[mediaIndex]=(sdpLines[mediaIndex].slice(0,(sdpLines[mediaIndex].indexOf("RTP/SAVPF")+10))).concat(opusPayload); 
 var abIndex = findLine(sdpLines, 'a=mid:');
  sdpLines[abIndex]='a=mid:audio\r\nb=AS:300000';

// Find the payload in fmtp line.
  var fmtpLineIndex = findLine(sdpLines, 'a=fmtp:' + opusPayload.toString());

if (fmtpLineIndex == null) {
    sdpLines[opusIndex] = sdpLines[opusIndex].concat('\r\n'+'a=fmtp:' + opusPayload.toString()+ ' minptime=10; useinbandfec=1; maxaveragebitrate='+128*1024+'; stereo=1; sprop-stereo=1 ; cbr=1');
     sdp = sdpLines.join('\r\n');

    return sdp;
}

// Append stereo=1 to fmtp line.
// added maxaveragebitrate here; about 50 kbits/s
// added stereo=1 here for stereo audio
// x-google-min-bitrate=50; x-google-max-bitrate=50
sdpLines[fmtpLineIndex] = sdpLines[fmtpLineIndex].concat('; maxaveragebitrate='+128*1024+'; stereo=1; sprop-stereo=1 ; cbr=1');


sdp = sdpLines.join('\r\n');
return sdp;
}
现在一切都准备好了,firefox和chrome都为发送者和接收者显示正确的值,通信打开,音乐播放

adding answer-sdp v=0
o=mozilla...THIS_IS_SDPARTA-42.0 502631676322875352 0 IN IP4 0.0.0.0
s=-
t=0 0
a=fingerprint:sha-256.....
a=ice-options:trickle
a=msid-semantic:WMS *
m=audio 9 RTP/SAVPF 109 
c=IN IP4 0.0.0.0
a=recvonly
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=ice-pwd:c56d106030599efe08cfa2a4f9b3ad5a
a=ice-ufrag:93982a76
a=mid:audio
b=AS:300000
a=rtcp-mux
a=rtpmap:109 opus/48000/2
a=fmtp:109 minptime=10; useinbandfec=1; maxaveragebitrate=131072; stereo=1; sprop-stereo=1 ; cbr=1
a=setup:active
a=ssrc:1948755120 cname:{208483df-13c9-e347-ba4a-c71604df3ad9}
但是质量太差了。Chrome在屏幕上显示约30kbit/schrome://webrtc-internals/ 而且声音随着音量的变化而严重失真。。。 有关于这个问题的线索吗?

我创建了一个。您输入SDP描述,获取JSON对象,然后再次序列化它


这样,将SDP作为对象处理比作为批量文本处理容易得多。

质量差的主要原因是浏览器的音频处理。 您需要将音频约束传递给GetUserMedia对象:


{'channelCount':{'exact':2},'echoCancellation':false,'autoGainControl':false,'noiseSuppression':false}

您需要在SDP上设置
立体声
最大平均比特率
属性:

let answer = await peer.conn.createAnswer(offerOptions);
answer.sdp = answer.sdp.replace('useinbandfec=1', 'useinbandfec=1; stereo=1; maxaveragebitrate=510000');
await peer.conn.setLocalDescription(answer);
这将输出一个如下所示的字符串:

a=fmtp:111 minptime=10;useinbandfec=1; stereo=1; maxaveragebitrate=510000
这给了我520kb/s的立体声比特率,即每个通道260kps。您获得的实际比特率将根据网络速度和信号强度而变化


更多SDP属性记录在:

Hey!看起来不错!我试试看。main/source/js/中似乎缺少一个文件,因为我找不到sdpparser.js文件。。我真的很想知道我做错了什么!该文件没有丢失,它是根据pegjs语法自动生成的。你试过npm吗?我不明白!我的错。我用pegjs生成了.js,我会给你反馈的!很高兴它成功了!我会把它包括在文档中。非常感谢您的反馈。我发布了v0.0.2,其中也包括生成的文件和依赖项。我还修改了文档。