能看到这篇文章的基本上都是有迫切需求的人,话不多说,切入正题
编解码库:Speex
编码硬件平台:STM32F411——Cortex-M4
编码开发环境SDK:STM32CubeMX5.0.0 + Keil 5.26.2
解码平台:PC机
解码开发环境SDK:Visual Studio 2017(v141)——WSDK:10.0.17763.0
首先要说明一点,这个实例所使用的不是官网提供的源生Speex库,而是STM32官方提供的库,但是这个库是在2009年编写的,下载地址找不到了,但是有文档
ST官方文档:AN2812
我将此库下载地址放到CSDN上
https://download.csdn.net/download/weixin_41738734/10851597
增加宏定义 HAVE_CONFIG_H
增大Heap_Size为0x8000
修改内存分配函数(os_support.h)
修改完毕后就可正常使用了。
初始化:
SpeexBits bits;/* Holds bits so they can be read and written by the Speex routines */
void *enc_state, *dec_state;/* Holds the states of the encoder & the decoder */
int quality = 4, complexity=1, vbr=0, enh=1;/* SPEEX PARAMETERS, MUST REMAINED UNCHANGED */
int frame_size;
void Speex_Init(void)
{
/* Speex encoding initializations */
speex_bits_init(&bits);
enc_state = speex_encoder_init(&speex_nb_mode);
speex_encoder_ctl(enc_state, SPEEX_SET_VBR, &vbr);
speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY,&quality);
speex_encoder_ctl(enc_state, SPEEX_SET_COMPLEXITY, &complexity);
speex_encoder_ctl(enc_state,SPEEX_GET_SAMPLING_RATE,&frame_size);
/* speex decoding intilalization */
dec_state = speex_decoder_init(&speex_nb_mode);
speex_decoder_ctl(dec_state, SPEEX_SET_ENH, &enh);
}
编码方式1:
speex_bits_reset(&bits);
/* Encode the frame */
speex_encode_int(enc_state, (spx_int16_t*)&rdata[rdata_len], &bits);
/* Copy the bits to an array of char that can be decoded */
speex_bits_write(&bits, (char *)&recoder_outdata[recoder_out_data_loc], ENCODED_FRAME_SIZE);
编码方式2:
speex_bits_reset(&bits);
/* Encode the frame */
while(i--)
speex_encode_int(enc_state, (spx_int16_t*)&rdata[rdata_len], &bits);
/* Copy the bits to an array of char that can be decoded */
speex_bits_write(&bits, (char *)&recoder_outdata[recoder_out_data_loc], ENCODED_FRAME_SIZE);
主要是有关修改的地方
使用CTRL+H替换功能 将所有函数名前面的EXPORT删除
初始化代码相同不再多说
/* Copy the encoded data into the bit-stream struct */
speex_bits_read_from(&bits, (char*)&fin_ptr[read_loc], 20);
/* Decode the data */
speex_decode_int(dec_state, &bits, (spx_int16_t *)out);
代码验证过。没有问题,并经过回环测试(STM32压缩并记录到SD卡上,在PC端进行还原),但是由于工作原因,不能放出STM32的代码。希望大家自己多试试。