WebRTC中OPUS编码相关设置和分析
2017-08-05 10:27
417 查看
新版本的WebRTC默认是采用OPUS编码,OPUS编码是silk编码和celt编码的合成,silk编码是skype公司开源的一个编码,
特别适合语音通信,它根据人的声音做了很多优化,但不是适合传输高质量的音乐。celt编码相反更适合传输高质量的音乐。
OPUS编码在采样率很高的情况下,音质还是非常不错的,以下这个连接地址有很多opus的音频样例,大家可以在线听听。 http://www.opus-codec.org/examples/
根据阅读官方文档知道OPUS编码支持8000,16000,32000,48000等几种编码,支持单声道,双声道,支持6kb-510kb编码率。如果我们想改变WebRTC的声音
编码参数,我们应该如何做呢?
1.首先我会先去看看WebRTC有没有引出相关的接口,结果查看了PeerConnection,MediaStream,AudioTrack等等相关的类后,根本没有发现相关接口。
2.根据以往经验,如果WebRTC没有提供直接的接口来调,往往还可以通过修改SDP参数和达到我们的目的。我把生成的Offer
SDP打印出来后,发现了比较可疑的地
方,"fmtp:111
minptime=10;useinbandfec=1",这一行是设置opus编码参数的地方。我再以“useinbandfec”为关键字在WebRTC中代码中搜索,
在mediaconstants.cc代码,找到以下相关代码
// draft-spittka-payload-rtp-opus-03.txt
const char kCodecParamPTime[] = "ptime";
const char kCodecParamMaxPTime[] = "maxptime";
const char kCodecParamMinPTime[] = "minptime";
const char kCodecParamSPropStereo[] = "sprop-stereo";
const char kCodecParamStereo[] = "stereo";
const char kCodecParamUseInbandFec[] = "useinbandfec";
const char kCodecParamUseDtx[] = "usedtx";
const char kCodecParamMaxAverageBitrate[] = "maxaveragebitrate";
const char kCodecParamMaxPlaybackRate[] = "maxplaybackrate";
3.我依葫芦画瓢,在我自己写的de
b2b6
mo代码中把sdp中的"fmtp:111
minptime=10;useinbandfec=1" 这一行替换成"fmtp:111
minptime=10;useinbandfec=1;maxaveragebitrate
=8000",编译成功运行后,发现参数生效了,发送一路语音占用的带宽由于5K变成了3K左右,这就证明参数生效了。
4.在网络挺别差的情况下,我们可能希望声音的码流再变小一点,对音质的要求反而不是哪么高了,音频采样率为8000HZ就够了。要实现这个功能的话把"fmtp:111
minptime=10;useinbandfec=1" 这一行替换成"fmtp:111
minptime=10;useinbandfec=1;maxaveragebitrate
=6000;maxplaybackrate=8000"就行了
5.如果要传音乐,哪我们必需强制OPUS切换到CELT编码。要实现这个功能的话把"fmtp:111
minptime=10;useinbandfec=1" 这一行替换成"fmtp:111
minptime=10;useinbandfec=1;maxaveragebitrate
=64000;maxplaybackrate=48000;stereo=1"就行了
以下功能在WebRTC56版本中试验成功,修改SDP的时机在 SetRemoteDescription
之前,把对方传过来的SDP字符串给替换了,再调用SetRemoteDescription方法
特别适合语音通信,它根据人的声音做了很多优化,但不是适合传输高质量的音乐。celt编码相反更适合传输高质量的音乐。
OPUS编码在采样率很高的情况下,音质还是非常不错的,以下这个连接地址有很多opus的音频样例,大家可以在线听听。 http://www.opus-codec.org/examples/
根据阅读官方文档知道OPUS编码支持8000,16000,32000,48000等几种编码,支持单声道,双声道,支持6kb-510kb编码率。如果我们想改变WebRTC的声音
编码参数,我们应该如何做呢?
1.首先我会先去看看WebRTC有没有引出相关的接口,结果查看了PeerConnection,MediaStream,AudioTrack等等相关的类后,根本没有发现相关接口。
2.根据以往经验,如果WebRTC没有提供直接的接口来调,往往还可以通过修改SDP参数和达到我们的目的。我把生成的Offer
SDP打印出来后,发现了比较可疑的地
方,"fmtp:111
minptime=10;useinbandfec=1",这一行是设置opus编码参数的地方。我再以“useinbandfec”为关键字在WebRTC中代码中搜索,
在mediaconstants.cc代码,找到以下相关代码
// draft-spittka-payload-rtp-opus-03.txt
const char kCodecParamPTime[] = "ptime";
const char kCodecParamMaxPTime[] = "maxptime";
const char kCodecParamMinPTime[] = "minptime";
const char kCodecParamSPropStereo[] = "sprop-stereo";
const char kCodecParamStereo[] = "stereo";
const char kCodecParamUseInbandFec[] = "useinbandfec";
const char kCodecParamUseDtx[] = "usedtx";
const char kCodecParamMaxAverageBitrate[] = "maxaveragebitrate";
const char kCodecParamMaxPlaybackRate[] = "maxplaybackrate";
3.我依葫芦画瓢,在我自己写的de
b2b6
mo代码中把sdp中的"fmtp:111
minptime=10;useinbandfec=1" 这一行替换成"fmtp:111
minptime=10;useinbandfec=1;maxaveragebitrate
=8000",编译成功运行后,发现参数生效了,发送一路语音占用的带宽由于5K变成了3K左右,这就证明参数生效了。
4.在网络挺别差的情况下,我们可能希望声音的码流再变小一点,对音质的要求反而不是哪么高了,音频采样率为8000HZ就够了。要实现这个功能的话把"fmtp:111
minptime=10;useinbandfec=1" 这一行替换成"fmtp:111
minptime=10;useinbandfec=1;maxaveragebitrate
=6000;maxplaybackrate=8000"就行了
5.如果要传音乐,哪我们必需强制OPUS切换到CELT编码。要实现这个功能的话把"fmtp:111
minptime=10;useinbandfec=1" 这一行替换成"fmtp:111
minptime=10;useinbandfec=1;maxaveragebitrate
=64000;maxplaybackrate=48000;stereo=1"就行了
以下功能在WebRTC56版本中试验成功,修改SDP的时机在 SetRemoteDescription
之前,把对方传过来的SDP字符串给替换了,再调用SetRemoteDescription方法
相关文章推荐
- 转:【创龙TMS320C6748开发板试用】相关软件的安装与基本设置+CCS安装失败分析
- webRTC的 OPUS编码 在FEC中的应用
- 安全设置相关at流程分析
- ThinkPHP入口文件设置及相关注意事项分析
- android 安全设置相关at流程分析
- 网页Cookie设置作用以及相关Cookies属性分析
- 【获利能力分析】相关的设置和事务码
- eclipse相关编码设置
- 数据库零碎---mysql编码设置,与乱码分析
- MYSQL数据库编码设置相关
- linux下安装mysql及用户、引擎、连接数、编码等相关设置
- 第三天,编码设置,主键设置与删除,无关子查询,相关子查询,表与表之间的关系
- ThinkPHP入口文件设置及相关注意事项分析
- WebRTC中的Opus编码揭秘
- AAC 编码之 ADTS 头相关分析
- STM32中断设置相关寄存器的分析
- JSP/Servlet中的编码相关设置
- 【项目开发】mysql-5.5字符编码相关的设置与查询
- 微信接口 请求 编码 utf-8 相关设置
- Eclipse 编译工具 相关编码的设置