webRTC: 如何告诉Opus编解码器使用超宽带/全带宽

6

我正在开发一个WebRTC的Web应用程序,目前它已经运作得非常好。但是我还没有找到如何告诉Opus编解码器使用“全频段”(例如强制使用)。

将编解码器设置为510kHz的比特率很容易:

desc.sdp=desc.sdp.replace(/a=mid:audio\r\n/g,'a=mid:audio\r\nb=AS:510\r\n');

但有没有一种方法告诉Opus要使用哪个频段?
1个回答

8

指定频段并不难。使用opus,您只需指定最大速率功能,然后让它自行运行。默认情况下,OPUS会达到其最大能力(48000,也称为全频带)。

此外,请记住,无论您指定什么捕获速率,rtp时钟速率必须为48000。

下面的示例取自rfc第7节

m=audio 54312 RTP/AVP 101
a=rtpmap:101 opus/48000/2
a=fmtp:101 maxplaybackrate=16000; sprop-maxcapturerate=16000

这指定了发送者的最大捕获和播放速率为16kHz(也称为宽带)。

双向全频带立体声。

m=audio 54312 RTP/AVP 101
a=rtpmap:101 opus/48000/2
a=fmtp:101 stereo=1; sprop-stereo=1

如果您想指定首选带宽,最关注的选项是:
  • maxplaybackrate:Hz中接收器能够呈现的最大输出采样率的提示。
  • sprop-maxcapturerate:发送者可能产生的最大输入采样率的提示。
不同频段及其对应的最大值:
  • NB:8 kHz
  • MB:12 kHz
  • WB:16 kHz
  • SWB:24 kHz
  • FB:48 kHz //webrtc中的编解码器默认值
此外,请注意比特率和采样率之间的区别。您修改了比特率,这可能会强制Opus更改采样率,但我展示的选项根本不修改比特率,只更改采样率。
附言:所有这些都取决于webrtc实现的情况,以及它是否真正关心SDP中指定的内容,以及它是否真正影响opus编码/解码。我曾经注意到(过去可能已经改变),Firefox中的实现完全不关心SDP中的内容,而只是按默认方式进行操作。

非常感谢。我希望这些设置能够消除我经常听到的音频伪像(以及音乐中的节奏变化)。你知道是否有更好/标准的方法来修改sdp字符串而不是执行某些部分的查找和替换吗? - Armin Hierstetter
@ArminHierstetter,我知道有一些更轻量级的SDP解析器可以使用,但在WebRTC技术的浏览器实现中,替换SDP中的字符串并在本地设置后发送是我所知道的唯一方法。 - Benjamin Trent
@ArminHierstetter,您还可以通过确保使用恒定的比特率(也可以在SDP中设置,参见提到的rfc)来防止比特率下降或上升。 - Benjamin Trent
关于Asterisk中的opus 8000/1怎么样?在Asterisk中是否可能使用窄带宽? - Avani badheka
@Avanibadheka 这个问题与星号无关,如果您有关于星号的特定问题...您应该发布一个新问题。 - Benjamin Trent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接