zoukankan      html  css  js  c++  java
  • [WebRTC] 源码中的Audio Codec整理

    源码位置

    [Code:webrtcsrcapiaudio_codecs]
    [Code:modulesaudio_codingcodecs]
    

    WebRTC默认是采用OPUS编码。

    Opus

    WebRTC中默认是采用Opus编码,Opus编码是由silk编码和celt编码合并在一起,silk编码是由skype公司开源的一种语音编码,特别适合人声,适合于Voip语音通信。celt和mp3,aac类似,适合于传输音乐。Opus编码具备以下特点:

    * 6 kb /秒到510 kb / s的比特率
    * 采样率从8 kHz(窄带)到48 kHz(全频)
    * 帧大小从2.5毫秒到60毫秒
    * 支持恒定比特率(CBR)和可变比特率(VBR)
    * 从窄带到全频段的音频带宽
    * 支持语音和音乐
    * 支持单声道和立体声
    * 支持多达255个频道(多数据流的帧)
    * 可动态调节比特率,音频带宽和帧大小
    * 良好的鲁棒性丢失率和数据包丢失隐藏(PLC)
    * 浮点和定点实现
    

    WebRTC中要使用Opus编码,首先在SDP中要有以下定义:

    * a=rtpmap:111 *opus*/*48000*/2
    * a=rtcp-fb:111 transport-cc
    * a=fmtp:111 minptime=*10*;useinbandfec=1
    * 以上的WebRTC产生的默认配置,这种配置下,音频采样率是48000,音频打包时间是10ms,单声道,编码采用的是Opus里面的silk编码,适合传人声,不适合传音乐。
    

    参考:WebRTC中的Opus编码揭秘

    [Code:modulesaudio_codingcodecsopus]
    

    PCM16

    PCM 脉冲编码调制是Pulse Code Modulation的缩写。脉冲编码调制是数字通信的编码方式之一。主要过程是将话音、图像等模拟信号每隔一定时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。

    模拟信号数字化必须经过三个过程,即抽样、量化和编码。

    采样频率

    人对频率的识别范围是 20HZ ## 20000HZ, 如果每秒钟能对声音做 20000 个采样, 回放时就足可以满足人耳的需求.

    * 8000hz 为电话采样。
    * 22050 的采样频率是常用的。
    * 44100已是CD音质, 超过48000的采样对人耳已经没有意义。
    * 一般情况下,一帧PCM是由2048次采样组成的。
    

    采样位数

    每个采样数据记录的是振幅, 采样精度取决于储存空间(采样位数)的大小:
    * 1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级
    * 2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了;
    * 如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍.

    比特率

    码率是指经过编码后的音频数据每秒钟需要用多少个比特来表示

    无损音频

    一般都是指传统CD格式中的16bit/44.1kHz采样率的文件格式

    //采样位数:高低8位,拼接成16bit。
    size_t WebRtcPcm16b_Decode() {
    for (i = 0; i < len / 2; ++i)
    	speech[i] = encoded[2 * i] << 8 | encoded[2 * i + 1];
    }
    //采样频率:支持8K, 16k, 32k, 48k
    AudioDecoderPcm16B::AudioDecoderPcm16B(int sample_rate_hz, size_t num_channels)
    	: sample_rate_hz_(sample_rate_hz), num_channels_(num_channels) {
    RTC_DCHECK(sample_rate_hz == 8000 || sample_rate_hz == 16000 ||
    			sample_rate_hz == 32000 || sample_rate_hz == 48000)
    	<< "Unsupported sample rate " << sample_rate_hz;
    RTC_DCHECK_GE(num_channels, 1);
    }
    
    [Code:modulesaudio_codingcodecspcm16b]
    

    ISAC(Internet Speech Audio Codec)

    是一种宽带和超宽带音频编码器。
    [Code:modulesaudio_codingcodecsisac]

    LIBC(Internet Low Bitrate Codec)

    一种窄带语音编解码器,可以保证低带宽条件下较好的音质,采样频率:8khz;20ms每帧时比特率为15.2kbps;30ms每帧时比特率为13.33kbps

    [Code:modulesaudio_codingcodecsilbc]
    

    G.711

    一种由国际电信联盟(ITU-T)制定的音频编码方式,又称为ITU-T G.711。它代表了对数PCM(logarithmic pulse-code modulation)抽样标准,主要用于电话。它主要用脉冲编码调制对音频采样,采样率为8k每秒。它利用一个 64Kbps 未压缩通道传输语音讯号。 起压缩率为1:2, 即把16位数据压缩成8位。G.711是主流的波形声音编解码器。20ms打包,带宽为 ( 528/20 + 64) Kbit/s=90.4 Kbit/s

    G.711是最基本的一种编码方法,俗称PCM,采用μ-law(主要北美地区使用)和A-law(其它地区)两种非线性量化方法进行压缩。说它“基本”是因为一方面PCM算法非常简单,很多ADC硬件的输入输出就直接支持PCM格式;另一方面PCM格式在通信系统中往往需要进一步压缩,因此它是其它语音编码算法的输入源。

    [Code:modulesaudio_codingcodecsg711]
    

    G.722

    G.722.1是由Polycom提出的一套低码率低复杂度的宽带语音编码算法,主要采用了变换域编码方法,因此可以对语音(300~4000Hz)和7kHz以内的音乐进行编码,采样率为16kHz,其32kbps码率的重建语音质量相当于64 kbps G.722 SB-ADPCM。在实际的应用中,本算法在低码率时其音质要高于MP3等音频算法,再加上算法低复杂度非常适合嵌入式平台通信、存储应用。最后,它的附录C中提供了32kHz采样的14k带宽的音频编码方案,进一步提高了音质。

    [Code:modulesaudio_codingcodecsg722]
    

    Red (redundant audio coding)

    gather the two latest encodings from the underlying codec into one packet

    一个包内包含两种编码后的数据。

    [Code:modulesaudio_codingcodecs
    ed]
    

    *官方解释:RED (REDundant coding) * The primary motivation of sending redundant data is to be able to recover packets lost under lossy network conditions. If a packet is lost then the missing information may be reconstructed at the receiver from the redundant data that arrives in the following packet(s).

    // secondary data.
    AudioEncoder::EncodedInfo AudioEncoderCopyRed::EncodeImpl(){
    	if (secondary_info_.encoded_bytes > 0) {
    	encoded->AppendData(secondary_encoded_);
    	info.redundant.push_back(secondary_info_);
    	RTC_DCHECK_EQ(info.redundant.size(), 2);
    	}
    }
    

    CNG即comfort noise generator,舒适噪音生成

    • 舒适噪音生成(comfort noise generator,CNG)是一个在通话过程中出现短暂静音时用来为电话通信产生背景噪声的程序。
    • 舒适噪音生成是VoIP技术中静音抑制(silence suppression)或语音活动检测(VAD)的一部分。语音活动检测及舒适噪音生成是用来维持一个感受到的可接受的服务品质,同时尽可能降低传输成本和带宽使用。
    • 结合语音活动检测算法的舒适噪音生成可快速确定静音出现的时间,并在出现静音时产生人工噪音,直到语音活动重新恢复为止。产生的人工噪音可形成传输流不间断的假象,因此电话中的背景声音会从始至终保持连续,接听者不会有电话掉线的感觉。50%左右的通话中其实是没有讲话的。语音活动检测软件可以让一个携带语音拥塞的数据网通过因特网监测静音,通过阻止“静音封包”的传送来节省带宽。
    • 舒适噪音生成运用特殊算法制造能够与真实背景噪音相匹配的人工噪音。如果在静音期内声音传输完全中断,背景噪音的产生则有助于避免可能出现的噪音调制。需要抑制噪音调制的理由众多:一方面,噪音调制与自然背景噪音区别明显,通话方会觉得这种声音很不舒服;另一方面,当通讯恢复时,噪音调制会减少语言清晰度。
    • 据估算,运用语音活动检测及舒适噪音生成可将一组音频信道对带宽的需求降低50%。

    参考:CSDN:CNG(舒适噪声生成)

  • 相关阅读:
    EJB3.0
    EJB
    到底EJB是什么
    EJB到底是什么,真的那么神秘吗??
    ssh和ejb的区别
    struts2的一些小问题
    Struts2中ValueStack结构和总结
    Java 监听器
    浅谈cookie 和session 的区别
    理解Cookie和Session机制
  • 原文地址:https://www.cnblogs.com/herryzz/p/13195598.html
Copyright © 2011-2022 走看看