2015-11-11 2 views
2

Я пытаюсь передать несколько высококачественных аудиопотоков через WebRTC. Opus, основной рекламируемый кодек кажется идеальным, поскольку он может поддерживать до 510 кбит/с, что более чем необходимо. Проблема в том, что настройка Webrtc SDP намного менее очевидна, чем кажется. Благодаря большой работе Муаза Хана мне удалось заставить ее 128 кбит/с. основном код выглядит следующим образом:Как настроить SDP для высококачественного звука Opus

function setBandwidth(sdp) { 
var sdpLines = sdp.split('\r\n'); 


// Find opus payload. 
var opusIndex = findLine(sdpLines, 'a=rtpmap', 'opus/48000'); 
var opusPayload; 
if (opusIndex) { 
    opusPayload = '109'; 
} 
sdpLines[opusIndex]='a=rtpmap:'+opusPayload+' opus/48000/2'; 


    var mediaIndex = findLine(sdpLines, 'm=audio'); 
sdpLines[mediaIndex]=(sdpLines[mediaIndex].slice(0,(sdpLines[mediaIndex].indexOf("RTP/SAVPF")+10))).concat(opusPayload); 
var abIndex = findLine(sdpLines, 'a=mid:'); 
    sdpLines[abIndex]='a=mid:audio\r\nb=AS:300000'; 

// Find the payload in fmtp line. 
    var fmtpLineIndex = findLine(sdpLines, 'a=fmtp:' + opusPayload.toString()); 

if (fmtpLineIndex == null) { 
    sdpLines[opusIndex] = sdpLines[opusIndex].concat('\r\n'+'a=fmtp:' + opusPayload.toString()+ ' minptime=10; useinbandfec=1; maxaveragebitrate='+128*1024+'; stereo=1; sprop-stereo=1 ; cbr=1'); 
    sdp = sdpLines.join('\r\n'); 

    return sdp; 
} 

// Append stereo=1 to fmtp line. 
// added maxaveragebitrate here; about 50 kbits/s 
// added stereo=1 here for stereo audio 
// x-google-min-bitrate=50; x-google-max-bitrate=50 
sdpLines[fmtpLineIndex] = sdpLines[fmtpLineIndex].concat('; maxaveragebitrate='+128*1024+'; stereo=1; sprop-stereo=1 ; cbr=1'); 


sdp = sdpLines.join('\r\n'); 
return sdp; 
} 

Итак, теперь все готово, как светлячок и хром дисплей правильное значение для отправителя и получателя, открывается связь, музыка играет!

adding answer-sdp v=0 
o=mozilla...THIS_IS_SDPARTA-42.0 502631676322875352 0 IN IP4 0.0.0.0 
s=- 
t=0 0 
a=fingerprint:sha-256..... 
a=ice-options:trickle 
a=msid-semantic:WMS * 
m=audio 9 RTP/SAVPF 109 
c=IN IP4 0.0.0.0 
a=recvonly 
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level 
a=ice-pwd:c56d106030599efe08cfa2a4f9b3ad5a 
a=ice-ufrag:93982a76 
a=mid:audio 
b=AS:300000 
a=rtcp-mux 
a=rtpmap:109 opus/48000/2 
a=fmtp:109 minptime=10; useinbandfec=1; maxaveragebitrate=131072; stereo=1; sprop-stereo=1 ; cbr=1 
a=setup:active 
a=ssrc:1948755120 cname:{208483df-13c9-e347-ba4a-c71604df3ad9} 

Но качество ужасно. Chrome показывает около 30 кбит/с на хроме: // webrtc-internals/и звук сильно искажен с переменным объемом ... Любые указания по этому вопросу?

ответ

1

Я создал SDP parser. Вы загружаете описание SDP, получаете объект JSON и затем сериализуете его снова.

Таким образом, процесс обработки SDP намного проще, чем объемный текст.

+0

Эй! Это выглядит красиво! Я попробую. Кажется, файл отсутствует в main/source/js /, поскольку я не могу найти файл sdpparser.js. И я действительно хотел бы понять, что я сделал не так! –

+0

Этот файл не пропущен, он генерируется автоматически из грамматики pegjs. Вы пробовали с npm? –

+0

Я этого не понимал! Виноват. Я использовал pegjs для генерации .js, я дам вам отзывы об этом! –

Смежные вопросы