zoukankan      html  css  js  c++  java
  • WebRTC中OPUS编码相关设置和分析

    新版本的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.我依葫芦画瓢,在我自己写的demo代码中把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方法
  • 相关阅读:
    Learning NFS/NIS 2nd 读书笔记-Chapter3 NIS Operation
    Linux Enterprise Cluster Notes Ch11 LVS Introduction Theory
    Linux Enterprise Cluster NOtes Ch7 A Sample HA config
    Linux Enterprise Cluster Notes Ch10 build a Linux cluster
    Linux Enterprise Cluster NOtes Ch8 Heartbeat配置和维护
    当被监控的应用发生问题时,heartbeat会failover么?
    Linux Enterprise Cluster NOtes Ch9 Stonith and IPFail
    Linux Enterprise Cluster NOtes Ch6 Heartbeat介绍和原理
    客户端不支持javascript怎么办
    js 返回对象|js返回多个值的方法|js如何返回多个值
  • 原文地址:https://www.cnblogs.com/onlycoder/p/7297355.html
Copyright © 2011-2022 走看看