首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WebRTC PeerConnection中有选择编解码器的方法吗?

在WebRTC PeerConnection中有选择编解码器的方法吗?
EN

Stack Overflow用户
提问于 2014-01-28 10:27:13
回答 3查看 8.6K关注 0票数 5

嘿,我想知道在WebRTC中创建报价/应答时是否有选择编解码器的方法。目前可供选择的视频编解码器不多,但也有音频编解码器,如Opus、PCMU、PCMA等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-28 11:34:59

总的来说,是的。下面是如何在建立连接时使用Opus编解码器的示例。您应该从createAnswer或createOffer的回调函数中调用‘createOffer’。

代码语言:javascript
复制
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;
};
票数 10
EN

Stack Overflow用户

发布于 2019-11-17 06:49:14

选择Opus只会让你半途而废。即使有编解码器,它也可能默认为mono,大约42 kb/s,因为它主要是为语音设计的。

如果您不使用语音输入,并且需要一致的音乐,则可以使用约束禁用音频处理功能:

代码语言:javascript
复制
navigator.mediaDevices.getUserMedia({
  audio: {
    autoGainControl: false,
    channelCount: 2,
    echoCancellation: false,
    latency: 0,
    noiseSuppression: false,
    sampleRate: 48000,
    sampleSize: 16,
    volume: 1.0
  }
});

然后将SDP设置为stereo并增加maxaveragebitrate

代码语言:javascript
复制
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);

它应该输出如下所示的字符串:

代码语言:javascript
复制
a=fmtp:111 minptime=10;useinbandfec=1; stereo=1; maxaveragebitrate=510000

这使得立体声的潜在最大比特率为520 is /s,即每通道260 per。实际比特率取决于网络的速度和信号的强度。

您可以在:https://www.rfc-editor.org/rfc/rfc7587上阅读有关其他可用属性的更多信息。

票数 2
EN

Stack Overflow用户

发布于 2022-01-22 18:14:19

当浏览器开始支持setCodecPreferences时,您可以检查“音频/ opus”mimetype,并将编解码器首选项设置为opus编解码器:

代码语言:javascript
复制
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博客文章改编的代码来修复音频/视频编解码器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21402990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档