如何在 WebRTC 音频通话中控制单声道/立体声?

Ale*_*ama 4 javascript rtp sdp webrtc

我试图将我的音频呼叫强制为单声道,我愿意使用 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;
}
Run Code Online (Sandbox Code Playgroud)

其他功能可以在这里找到:

http://www.codeforge.com/read/252733/sdputils.js__html

链接上还有许多其他功能,但我不知道它们是否可以在我选择的编解码器上正常工作。

提前致谢!

Tay*_*ter 6

对于音频,“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
Run Code Online (Sandbox Code Playgroud)

  • 实际上 Opus 总是被声明为 `opus/48000/2`,因为它可以在会话期间在单声道和立体声之间透明地切换。接收器可以使用`stereo` fmtp 参数来指示它是否更喜欢立体声(默认是`stereo=0`,即单声道)。发送方还可以通过 `sprop-stereo` 参数(默认 `sprop-stereo=0`)指示是否可能发送立体声。有关详细信息,请参阅 [RFC 7587](https://tools.ietf.org/html/rfc7587)。无论发送什么,Opus 解码器都可以将其输出为单声道或立体声。这条线可能是您的 SDP 中最灵活的,而不是删除。 (2认同)