音频

Android中使用Speex

2019-05-08  本文已影响0人  Charein

Speex

这是一个Android Studio工程,集成了speex库,可以将音频编码成speex格式,也可以将speex格式的音频文件解码播放。

Speex介绍

Speex 编码流程

1、定义一个SpeexBits类型变量bits和一个Speex编码器状态变量enc_state。
2、调用speex_bits_init(&bits)初始化bits。
3、调用speex_encoder_init(&speex_nb_mode)来初始化enc_state。其中speex_nb_mode是SpeexMode类型的变量,表示的是窄带模式。还有speex_wb_mode表示宽带模式、speex_uwb_mode表示超宽带模式。
4、调用函数int speex_encoder_ ctl(void *state, int request, void *ptr)来设定编码器的参数,其中参数state表示编码器的状态;参数request表示要定义的参数类型,如SPEEX_ GET_ FRAME_SIZE表示设置帧大小,SPEEX_ SET_QUALITY表示量化大小,这决定了编码的质量;参数ptr表示要设定的值。
    可通过speex_encoder_ctl(enc_state, SPEEX_GET_FRAME_SIZE, &frame_size) 和speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY, &quality)来设定编码器的参数。
5、初始化完毕后,对每一帧声音作如下处理:调用函数speex_bits_reset(&bits)再次设定SpeexBits,然后调用函数speex_encode(enc_state, input_frame, &bits),参数bits中保存编码后的数据流。
6、编码结束后,调用函数speex_bits_destroy (&bits), speex_encoder_destroy (enc_state)来

Speex解码流程

1、 定义一个SpeexBits类型变量bits和一个Speex编码状态变量enc_state。
2、 调用speex_bits_init(&bits)初始化bits。
3、 调用speex_decoder_init (&speex_nb_mode)来初始化enc_state。
4、 调用函数speex_decoder_ctl (void *state, int request, void *ptr)来设定编码器的参数。
5、 调用函数 speex_decode(void *state, SpeexBits *bits, float *out)对参数bits中的音频数据进行解编码,参数out中保存解码后的数据流。
6、 调用函数speex_bits_destroy(&bits), speex_ decoder_ destroy (void *state)来关闭和销毁SpeexBits和解码器。

工程介绍

JNI封装了如下native方法可供使用:

public native int open(int compression);
public native int getFrameSize();
public native int decode(byte encoded[], short lin[], int size);
public native int encode(short lin[], int offset, byte encoded[], int size);
public native void close();

SpeexRecorder.java:用于将麦克风音频编码成speex格式并保存;

SpeexPlayer.java:用于播放speex编码格式的音频文件;

SpeexDecoder.java:用于解码speex编码格式的音频文件;

SpeexEncoder.java:将音频编码成speex格式。

使用说明

GITHUB:https://github.com/chenyayun/Speex

使用的时候拷贝libspeex-debug.aar到模块的lib目录下,并添加依赖即可。

注:libspeex的源代码付费获取请联系QQ:2060632083

上一篇下一篇

猜你喜欢

热点阅读