如何在 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 音频通话中控制单声道/立体声?的主要内容,如果未能解决你的问题,请参考以下文章

如何混合两个音频通道?

通过命令行仅将立体声声道音频文件转换为左声道

我是不是需要将立体声音频转换为单声道以进行 FFT?

使用音频工具 sox,我如何确定立体声录音是不是实际上是单声道?

AVPlayer 播放单声道音频立体声->单声道

在Javascript中将立体声音频转换为单声道