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方法
  • 相关阅读:
    SpringBootMybatis 关于Mybatis-generator-gui的使用|数据库的编码注意点|各项复制模板
    SpringBootMVC04——Mybatis
    SpringBootMVC02——SpringDataJpa与ThymeLeaf
    Big Data(六)用户权限实操&HDFS-API实操
    Big Data(五)关于Hadoop的HA的实践搭建
    Big Data(四)关于Hadoop的HA&CAP理论详解
    Big Data(三)伪分布式和完全分布式的搭建
    SpringBootMVC02——Spring Data JPA的使用&JSP的使用
    SpringBootMVC01——A simple SpringBootMVC Sample
    yum安装mysql
  • 原文地址:https://www.cnblogs.com/onlycoder/p/7297355.html
Copyright © 2011-2022 走看看