VoIP技术(4)-G.729-G.723-iLBC-语音编码

10 篇文章 4 订阅

4.4 算法—G.729分析

在VoIP系统中应用最广泛的就是G.729和G.723.1两种。G.729编码是LPC参数编码,线性预测采用的是前馈型前向自适应技术,并使用预视提高合成模型的精度。预测模型系数根据当前帧和部分下一帧话音数据进行更新,G.729帧长为10ms,由2个子帧组成,预视5ms。由于采用的是前向型自适应技术,因此除了传送激励信号外,还需传送预测器系数。为了降低复杂度,G.729标准又制定了一个附件A,称为G.729A,它的复杂度降低了一半。G.729AG.729比特流兼容。后来又指定了附件B,主要是包含了静音抑制处理。

由第三节关于RTP的介绍,可知RTP分组由RTP头部和净荷数据组成,如何将净荷数据封装到RTP分组中,并由UDP来进行传输,则有多种形式。下面根据典型的语音编码算法—G.729来进行说明。

 

G.729的编码速率为8kbit/s,帧长为10ms,每帧的大小为80bit,即10个字节。一个RTP分组通常包含两个帧。这样,20ms时间的净荷数据为20字节,加上RTP开销为12字节,UDP开销为8字节,IP开销为20字节,以太网开销为14字节,这样20ms内实际要传输的字节数为:20+12+8+20+14=74,传输速率为:74字节/20ms = 29600bit/s,见表2所示。

由表2可知,而当一个RTP分组仅包含1个帧时,传输速率为 51.2kbit/s,与64Kbit/s已经非常接近;而当一个RTP分组仅包含4个帧时,传输速率为 18.8kbit/s,但有较大的时延。因此一个RTP分组通常包含两个帧。为了降低传输速率,可以利用VAD/CNG 技术,通过引入静音帧来实现。

4.5 算法—G.723.1分析

G.723.1是一个双速率的LPC参数编码,低速率的编码比特率为5.3kbit/s,高速率的编码比特率为6.3kbit/s,线性预测也采用前馈型前向自适应技术,并使用预视。帧长(处理时延)30ms,分为4个子帧,前视时延7.5ms

由第三节关于RTP的介绍,可知RTP分组由RTP头部和净荷数据组成,如何将净荷数据封装到RTP分组中,并由UDP来进行传输,则有多种形式。下面根据典型的语音编码算法—G.723.1来进行说明。

      G.723.1的编码速率为5.3kbit/s6.3kbit/s,帧长为30ms,每帧的大小分别为20字节或24字节。一个RTP分组通常包含1个帧。这样,对于5.3kbit/s编码速率,30ms时间的净荷数据为20字节,加上RTP开销为12字节,UDP开销为8字节,IP开销为20字节,以太网开销为14字节,这样30ms内实际要传输的字节数为:20+12+8+20+14=74,传输速率为:74字节/30ms = 19733bit/s,见表3所示。

对于同编码速率,而当一个RTP分组仅包含2个帧时,传输速率为 12.5kbit/s,但有较大的时延。为了降低传输速率,也可以利用VAD/CNG 技术,通过引入静音帧来实现。

4.6 iLBC与G.729/G.723.2/G.711/GSM/T.38比较

       iLBC是一种专为包交换网络通信设计的编解码,优于目前流行的G.729、G.723.1,对丢包进行了特有处理,既使在丢包率 相当高的网络环境下,仍可获得非常清晰的语音效果。他的编码输出速率是13.33和15.2kbps两种速率。

            由第三节关于RTP的介绍,可知RTP分组由RTP头部和净荷数据组成,如何将净荷数据封装到RTP分组中,并由UDP来进行传输,则有多种形式。下面根据典型的语音编码算法—iLBC来进行说明。

iLBC的帧长速率是13.33kbps30ms,即编码速率为13.33kbit/s每帧的大小分别为50字节。模仿4.4节和4.5节的分析方法,并且为了比较各种方法的优劣,得出如下结论(13.33速率为例)

语音质量一直是VoIP应用的主要难点,如何保证和提高IP网络传输语音的通话效果,是VoIP应用迫切需要解决的问题。“iLBC”编解码的出现,解决了在包交换的IP网络中,传输语音所遇到的网络丢包严重影响通话质量等实际问题,实现了“语音质量的飞跃”。

  下图为在不同的网络丢包环境下,使用iLBC与G.729A、G.723.1编解码的语音质量比较。

图13 iLBC和G.729A/G.723.1的比较

无论在高丢包率条件下还是在没有丢包的条件下,iLBC的语音质量都优于目前流行的G.723.1, G.729A等标准编解码;而且丢包率越大,使用iLBC的语音质量优势越明显。通常情况下,为了衡量IP网络语音质量,将≥5%丢包率的网络情况定义为VoIP的极限网络条件。经过语音质量测试,即使在5%丢包率的情况下,iLBC仍然能够提供相当于GSM手机的语音质量。如下图所示的比较结果:

图14 语音质量比较

4.7 语音传输带宽

       在实际的应用过程经常要估算所需要的网络带宽。实际上,主要的网络带宽是用于语音传输,而用于控制数据的只占很小的一部分。

 

例如:两台中继网关之间传输2E1的语音

若采用的编码算法为G.729,RTP分组的封装长度为20ms。由于网关之间的传输的话路数为60,每路单向所需的网络带宽约为30kbit/s,这样实际所需的总带宽约为1.8Mbit/s当然,还要考虑传送H.323等协议控制数据的网络带宽,以及一定的网络带宽余量,一般来说2.5~3.0Mbit/s的网络带宽就可以了。

例入:4路媒体网关的接入

安装媒体网关时必须考虑接入网络的带宽。若采用的编码算法为6.3kbit/s的G.723.1,RTP分组的封装长度为30ms,则所需的网络带宽为:4×20.8=83.2kbit/s,一般来说,只要120150kbit/s的网络带宽即可。

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
This is a FFmpeg Win64 shared build by Kyle Schwarz. Zeranoe's FFmpeg Builds Home Page: This build was compiled on: Dec 30 2014, at: 17:29:04 FFmpeg version: 2.5.2 libavutil 54. 15.100 / 54. 15.100 libavcodec 56. 13.100 / 56. 13.100 libavformat 56. 15.102 / 56. 15.102 libavdevice 56. 3.100 / 56. 3.100 libavfilter 5. 2.103 / 5. 2.103 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 3.100 / 53. 3.100 This FFmpeg build was configured with: --disable-static --enable-shared --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib This build was compiled with the following external libraries: bzip2 1.0.6 Fontconfig 2.11.91 Frei0r 20130909-git-10d8360 GnuTLS 3.2.20 libiconv 1.14 libass 0.12.0 libbluray 0.6.2 libbs2b 3.1.0 libcaca 0.99.beta18 <http://caca.zoy.org
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
iLBC (internet Low Bitrate Codec) is a speech codec used for encoding and decoding speech signals. To decode an iLBC-encoded audio file, you can use a decoder library or tool that supports iLBC decoding. Here is an example of how you can decode an iLBC file using the libilbc library in C: 1. Install the libilbc library on your system. 2. Include the necessary header files in your C code: ```c #include <stdio.h> #include <stdlib.h> #include <ilbc/ilbc.h> ``` 3. Write a function to perform the iLBC decoding: ```c void ilbc_decode(const char* input_file, const char* output_file) { FILE* fin = fopen(input_file, "rb"); FILE* fout = fopen(output_file, "wb"); // Get input file size fseek(fin, 0, SEEK_END); long input_size = ftell(fin); rewind(fin); // Allocate memory for input and output buffers int16_t* input_buffer = (int16_t*)malloc(input_size); int16_t* output_buffer = (int16_t*)malloc(input_size * 2); // Double the size for stereo audio // Read the input file into the input buffer fread(input_buffer, sizeof(int16_t), input_size / sizeof(int16_t), fin); // Create an iLBC decoder instance iLBC_Dec_Inst_t* dec_inst = iLBC_create(1); // 1 for 20ms frame size // Perform the decoding int num_frames = input_size / (2 * sizeof(int16_t)); // Assuming mono audio, 2 bytes per sample iLBC_decode(dec_inst, input_buffer, num_frames, output_buffer); // Write the decoded audio to the output file fwrite(output_buffer, sizeof(int16_t), num_frames * sizeof(int16_t), fout); // Cleanup fclose(fin); fclose(fout); free(input_buffer); free(output_buffer); iLBC_free(dec_inst); } ``` 4. Call the `ilbc_decode` function with the input and output file paths: ```c int main() { const char* input_file = "encoded.ilbc"; const char* output_file = "decoded.pcm"; ilbc_decode(input_file, output_file); return 0; } ``` Make sure to replace "encoded.ilbc" with the path to your iLBC-encoded file and "decoded.pcm" with the desired output file path. After running the program, you should have the decoded audio in the output file. Please note that this is just a basic example, and you may need to modify it according to your specific requirements and the iLBC decoder library you are using.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值