本文主要是介绍speex库处理音频编解码in即时通讯开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近在做一个PC端即时通讯软件,类似RTX,在音频数据处理的过程中用到了Speex库。
最近需要做一个基于udp的实时语音聊天的应用,语音流的压缩方面,我选择了使用speex。
Speex是一套主要针对语音的开源免费,无专利保护的音频压缩格式。Speex工程着力于通过提供一个可以替代高性能语音编解码来降低语音应用输入门槛 。另外,相对于其它编解码器,Speex也很适合网络应用,在网络应用上有着自己独特的优势。同时,Speex还是GNU工程的一部分,在改版的BSD协议中得到了很好的支持。
上面这些都是度娘说的。
然后,看了一下speex手册和speex的api文档,写了一个简单的例程。
还是先介绍一下speex的简单使用吧~~
一、speex api的简单介绍
1. 编码:
a) 定义一个SpeexBits类型变量ebits和一个Speex编码器状态变量enc_state。
b) 调用speex_bits_init(&ebits)初始化。
c) 调用speex_encoder_init(&speex_nb_mode)来初始化enc_state。其中speex_nb_mode是SpeexMode类型的变量,表示的是窄带模式。还有speex_wb_mode表示宽带模式、speex_uwb_mode表示超宽带模式。
d) 调用函数int speex_encoder_ ctl(void *state, int request, void *ptr)来设定编码器的参数,其中参数state表示编码器的状态;参数request表示要定义的参数类型,如SPEEX_ GET_ FRAME_SIZE表示设置帧大小,SPEEX_ SET_QUALITY表示量化大小,这决定了编码的质量;参数ptr表示要设定的值。
e) 初始化完毕后,对每一帧声音作如下处理:调用函数speex_bits_reset(&ebits)再次设定SpeexBits,然后调用函数speex_encode_int(enc_state, input_frame, &ebits),参数ebits中保存编码后的数据流。
f) 编码结束后,调用函数speex_bits_destroy (&ebits),speex_encoder_destroy (enc_state)来销毁编码器
2. 解码
接口与编码类似,这里就不多说了~~
二、配置安装
在使用speex之前,首先当然要配置一下speex的环境,到官网下载 speex源码,我使用的 是1.2rc1版本。
tar zxvf speex-1.2rc1.tar.gz
cd speex-1.2rc1
./configure --prefix=/home/yzf/lib/speex (路径改成自己喜欢的)
make && make install
编译安装后,把/home/yzf/lib/speex/include 下的文件拷贝到 /usr/include下
把/home/yzf/lib/speex/lib/libspeex.so.1.5.0 拷贝到 /usr/lib下
并重命名为libspeex.so
并建立该文件的软链接 libspeex.so.1 : ln -s libspeex.so libspeex.so.1
因为有些系统-lspeex使用的是 libspeex.so.1,比如我用的一个服务器的redhat
三、例程:
下面是我写的一个例程,我用“伪单例模式”封装了一下speex的接口,方便自己使用~~
voice.h
#ifndef VOICE_H
#define VOICE_H/*
* 初始化和销毁
*/
void voice_encode_init();
void voice_encode_release();
void voice_decode_init();
void voice_decode_release();
/*
* 压缩编码
* short lin[] 语音数据
* int size 语音数据长度
* char encoded[] 编码后保存数据的数组
* int max_buffer_size 保存编码数据数组的最大长度
*/
int voice_encode(short in[], int size,
char encoded[], int max_buffer_size);
/*
* 解码
* char encoded[] 编码后的语音数据
* int size 编码后的语音数据的长度
* short output[] 解码后的语音数据
* int max_buffer_size 保存解码后的数据的数组的最大长度
*/
int voice_decode(char encoded[], int size,
short output[], int max_buffer_size);
#endif //define VOICE_H
voice.cpp
#include <speex/speex.h>
#include <cstring>
#include
这篇关于speex库处理音频编解码in即时通讯开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!