嘿,我想知道在WebRTC中创建报价/应答时是否有选择编解码器的方法。目前可供选择的视频编解码器不多,但也有音频编解码器,如Opus、PCMU、PCMA等。
发布于 2014-01-28 11:34:59
总的来说,是的。下面是如何在建立连接时使用Opus编解码器的示例。您应该从createAnswer或createOffer的回调函数中调用‘createOffer’。
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;
};发布于 2019-11-17 06:49:14
选择Opus只会让你半途而废。即使有编解码器,它也可能默认为mono,大约42 kb/s,因为它主要是为语音设计的。
如果您不使用语音输入,并且需要一致的音乐,则可以使用约束禁用音频处理功能:
navigator.mediaDevices.getUserMedia({
audio: {
autoGainControl: false,
channelCount: 2,
echoCancellation: false,
latency: 0,
noiseSuppression: false,
sampleRate: 48000,
sampleSize: 16,
volume: 1.0
}
});然后将SDP设置为stereo并增加maxaveragebitrate
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这使得立体声的潜在最大比特率为520 is /s,即每通道260 per。实际比特率取决于网络的速度和信号的强度。
您可以在:https://www.rfc-editor.org/rfc/rfc7587上阅读有关其他可用属性的更多信息。
发布于 2022-01-22 18:14:19
当浏览器开始支持setCodecPreferences时,您可以检查“音频/ opus”mimetype,并将编解码器首选项设置为opus编解码器:
let tcvr = pc.getTransceivers()[0];
let codecs = RTCRtpReceiver.getCapabilities('audio').codecs;
let opus_codecs = [];
// iterate over supported codecs and pull out the codecs we want
for(let i = 0; i < codecs.length; i++)
{
if(codecs[i].mimeType == "audio/opus")
{
opus_codecs .push(codecs[i]);
}
}
// currently not all browsers support setCodecPreferences
if(tcvr.setCodecPreferences != undefined)
{
tcvr.setCodecPreferences(opus_codecs);
}从这个Pericror博客文章改编的代码来修复音频/视频编解码器。
https://stackoverflow.com/questions/21402990
复制相似问题