如何在 WebRTC 音频通话中控制单声道/立体声?
Posted
技术标签:
【中文标题】如何在 WebRTC 音频通话中控制单声道/立体声?【英文标题】:How to control mono/stereo in WebRTC audio call? 【发布时间】:2017-06-26 10:19:18 【问题描述】:我正在尝试将我的音频呼叫强制为单声道,我愿意使用 PCMU、G.729、OPUS 和 SpeeX 作为我的编解码器来进行此呼叫。
现在我正在使用以下代码在我的 sdp 消息中搜索选择的编解码器:
function maybePreferCodec(sdp, type, dir, codec)
var str = type + ' ' + dir + ' codec';
if (codec === '')
return sdp;
var sdpLines = sdp.split('\r\n');
// Search for m line.
var mLineIndex = findLine(sdpLines, 'm=', type);
if (mLineIndex === null)
return sdp;
// If the codec is available, set it as the default in m line.
var codecIndex = findLine(sdpLines, 'a=rtpmap', codec);
console.log('codecIndex', codecIndex);
if (codecIndex)
var payload = getCodecPayloadType(sdpLines[codecIndex]);
if (payload)
sdpLines[mLineIndex] = setDefaultCodec(sdpLines[mLineIndex], payload);
sdp = sdpLines.join('\r\n');
return sdp;
其他功能可以在这里找到:
http://www.codeforge.com/read/252733/sdputils.js__html
链接上还有许多其他功能,但我不知道它们是否能在我选择的编解码器上正常工作。
提前致谢!
【问题讨论】:
【参考方案1】:对于音频,“a=rtpmap”行的格式为:
a=rtpmap:<payload type> <encoding name>/<clock rate>[/<number of channels>]
例如:
a=rtpmap:111 opus/48000/2
因此,您可以扫描这些行,并删除任何具有 2 个通道的编解码器。请注意,要删除编解码器,您还需要从“m=”行中删除有效负载类型(在本例中为 111),并为其删除“a=fmtp”行。我相信sdputils.js 有代码可以做这种事情。
不过,Opus 有点特殊,因为它始终显示为具有 2 个通道,这允许它在带内单声道和立体声之间切换,而无需提供新的报价/答案。因此,对于 Opus,立体声与单声道偏好由设置为 0 或 1 的“立体声”参数指示:
a=fmtp:111 stereo=0
【讨论】:
实际上 Opus 总是声明为opus/48000/2
,因为它可以在会话期间透明地在单声道和立体声之间切换。接收器可以使用stereo
fmtp 参数来指示它是否更喜欢立体声(默认为stereo=0
,即单声道)。发送方还可以通过sprop-stereo
参数(默认sprop-stereo=0
)指示是否可能发送立体声。有关详细信息,请参阅RFC 7587。无论发送什么,Opus 解码器都可以将其输出为单声道或立体声。此行可能是您的 SDP 中最灵活的行,而不是要删除的行。
你能解释一下什么是单声道,什么是立体声吗?提前致谢【参考方案2】:
您可以使用https://github.com/beradrian/sdpparser,然后将整个 SDP 有效负载修改为 JSON 对象。免责声明:我是 sdpparser 的作者。
【讨论】:
以上是关于如何在 WebRTC 音频通话中控制单声道/立体声?的主要内容,如果未能解决你的问题,请参考以下文章