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

时间:2017-02-08 16:57:30

标签: javascript webrtc rtp sdp

我试图将我的音频呼叫强制为单声道,我愿意使用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

链接上还有许多其他功能,但我不知道他们是否能够正确使用我选择的编解码器。

提前致谢!

2 个答案:

答案 0 :(得分:4)

对于音频," a = rtpmap"的格式行是:

a=rtpmap:<payload type> <encoding name>/<clock rate>[/<number of channels>]

例如:

a=rtpmap:111 opus/48000/2

因此,您可以扫描这些行,并删除任何带有2个通道的编解码器。请注意,要删除编解码器,您还需要从&#34; m =&#34;删除有效负载类型(在本例中为111)。 line,并删除&#34; a = fmtp&#34;它的线条。我相信sdputils.js有代码来执行此类操作。

Opus有点特殊情况,因为它总是显示为有2个声道,这使得它可以在单声道和立体声带内切换,而无需进行新的提供/应答。因此,对于Opus,立体声与单声道偏好由&#34;立体声&#34;表示。参数设置为0或1:

a=fmtp:111 stereo=0

答案 1 :(得分:0)

您可以使用https://github.com/beradrian/sdpparser,然后将整个SDP有效内容修改为JSON对象。免责声明:我是sdpparser的作者。