linux 用speex库压缩音频

原创 2012年03月21日 09:34:58


int sound::encode()

{

FILE *fin,*fout1,*fout2,*fout3;//三个文件指针,fin为已录制好的音频文件

short in[FRAME_SIZE];

short out[FRAME_SIZE];

float input[FRAME_SIZE];

float output[FRAME_SIZE];//设置几个缓冲区

char cbits[200];

int nbBytes;//用来记录每次编码出来的数据量

qDebug()<<"i love china!!";

void *stateencode;

void *statedecode;

qDebug()<<"loveing china!!";

SpeexBits bitsencode;

SpeexBits bitsdecode;

qDebug()<<"hello!!";

int i,tmp;

stateencode = speex_encoder_init(&speex_nb_mode);//初始化编码器,

qDebug()<<"world!! and the stateencode is:"<<stateencode;

statedecode = speex_decoder_init(&speex_nb_mode);

qDebug()<<"power and the statedecode is:"<<statedecode;

tmp=0;

int k=0;

k=speex_encoder_ctl(stateencode,SPEEX_SET_VBR,&tmp);

qDebug()<<"ooxx set VBR "<<k;

float q=8.0;

tmp=8;

k=speex_encoder_ctl(stateencode,SPEEX_SET_VBR_QUALITY,&q);

qDebug()<<"!!!!!!!!!!!!!!!!! SET VBR QUALITY "<<k;

k=speex_encoder_ctl(stateencode,SPEEX_SET_QUALITY,&tmp);

qDebug()<<"***********************"<<k;

fin = fopen("./test.wav","rb");

fout1 =fopen("./demo.raw","wb");

fout2 = fopen("./demo.wav","wb");

fout3= fopen("./demoslience","wb");

qDebug()<<"After open the file!!";

speex_bits_init(&bitsencode);

qDebug()<<"speex bits init encode "<<k;

speex_bits_init(&bitsdecode);

qDebug()<<"speex bits init decode "<<k;

qDebug()<<"After the bits init";

int j=0;

SpeexPreprocessState *m_st;

SpeexPreprocessState *echo_state;

qDebug()<<"Aftre the SpeexPreprocessStat";

m_st=speex_preprocess_state_init(160,8000);

qDebug()<<"After the speex_preprocess_state"<<m_st;

int denoise =1;

int noisesuppress=-25;

k= speex_preprocess_ctl(m_st,SPEEX_PREPROCESS_SET_DENOISE,&denoise);

k=speex_preprocess_ctl(m_st,SPEEX_PREPROCESS_SET_NOISE_SUPPRESS,&noisesuppress);

int agc =1;

q =24000;

k=speex_preprocess_ctl(m_st,SPEEX_PREPROCESS_SET_AGC,&agc);

k=speex_preprocess_ctl(m_st,SPEEX_PREPROCESS_SET_AGC_LEVEL,&q);

int vad =1;

int vadprobstart = 80;

int vadprobcontinue = 65;

qDebug()<<"before the SET VAD";

k=speex_preprocess_ctl(m_st,SPEEX_PREPROCESS_SET_VAD,&vad);

k=speex_preprocess_ctl(m_st,SPEEX_PREPROCESS_SET_PROB_START,&vadprobstart);

k=speex_preprocess_ctl(m_st,SPEEX_PREPROCESS_SET_PROB_CONTINUE,&vadprobcontinue);

while(1)

{

qDebug()<<"in the while";

memset(out,0,160*sizeof(short));

j++;

qDebug()<<"before the read the file and the j is:"<<j;

int r=fread(in,sizeof(short),160,fin);

qDebug()<<"after the read the file and the r is"<<r;

if(feof(fin))

break;

qDebug()<<"ooxxoxxooxxoxxoox";

spx_int16_t *ptr=(spx_int16_t *)in;

qDebug()<<"*************************"<<ptr;

if(speex_preprocess_run(m_st,ptr))

{

printf("speech,");

fwrite(in,sizeof(short),FRAME_SIZE,fout3);

}

else

{

printf("slience,");

fwrite(in,sizeof(short),FRAME_SIZE,fout3);

}

qDebug()<<"the in size is"<<sizeof(in)<<"the in is : "<<in;

i = fwrite(in,sizeof(short),FRAME_SIZE,fout3);

r = fflush(fout3);

for(i=0;i<FRAME_SIZE;i++)

input[i]=in[i];

qDebug()<<"It is starting decode...";

speex_bits_reset(&bitsencode);

qDebug()<<"after bits reset and the k is:"<<k;

int ret =speex_encode(stateencode,input,&bitsencode);

qDebug()<<"after the speex encode"<<ret;

nbBytes = speex_bits_write(&bitsencode,cbits,200);

qDebug()<<"after speex bits write";

k=fwrite(cbits,sizeof(char),nbBytes,fout1);

r = fflush(fout1);

qDebug()<<"check the fflush fout1 and the result is:"<<r;

qDebug()<<"after the write in to the fout1: "<<k;

qDebug()<<"nbBytes is,"<<nbBytes;

speex_bits_reset(&bitsdecode);

qDebug()<<"after the second bits reset";

speex_bits_read_from(&bitsdecode,cbits,nbBytes);

qDebug()<<"after speex bits read from";

qDebug()<<"statedecode:"<<statedecode;

qDebug()<<"&bitsdecode:"<<&bitsdecode;

//memset(statedecode,0,160*sizeof(short));

//qDebug()<<"bitsdecode:"<<bitsdecode;

qDebug()<<"the sizeof of out is"<<sizeof(out);

qDebug()<<"the out is "<<out;

qDebug()<<"bitsdecode"<<bitsdecode.buf_size;

qDebug()<<"bitsdecode"<<bitsdecode.overflow;

qDebug()<<"bitsdecode"<<bitsdecode.owner;

ret = speex_decode_int(statedecode,&bitsdecode,out);

qDebug()<<"after the speex decode and the ret is:"<<ret;

/* for(i=0;i<128;i++)

out[i]=output[i];*/

r = fwrite(out,sizeof(short),128,fout2);

qDebug()<<"after to write into the fout2:"<<r;

r = fflush(fout2);

qDebug()<<"check the fflush fout2"<<r;

}

speex_encoder_destroy(stateencode);

speex_bits_destroy(&bitsencode);

speex_decoder_destroy(statedecode);

speex_bits_destroy(&bitsdecode);

fclose(fin);

fclose(fout1);

fclose(fout2);

fclose(fout3);

return 0;

}


语音降噪算法 噪音消除

  • 2009年03月21日 16:37
  • 371KB
  • 下载

关于音频降噪

常见的音频降噪算法,对于加性平稳随机噪声,效果还是很不错的,加性平稳随机噪声的假设是很多语音增强的假设前提。 关于非平稳噪声,比如,发动机的轰鸣声、风声、街道上别人的声音,就需要根据场景来处理,要单...
  • LIYUAN123ZHOUHUI
  • LIYUAN123ZHOUHUI
  • 2016年05月31日 11:31
  • 1258

speex开源代码,低带宽,高压缩率

  • 2008年09月12日 14:03
  • 1.01MB
  • 下载

音频调研之opus speex

  音频编码调研 Opus http://www.opus-codec.org/ Opus是一种混合式(hybrid)的编码器,有Skype的SILK和Xiph.org的CELT融合...
  • jiaoyangwuze
  • jiaoyangwuze
  • 2016年09月02日 14:42
  • 879

live555传输Speex音频详解二:Speex 使用SDP及其它事项

1. Speex使用SDP 当使用SDP来描述使用Speex格式的会话时,映射是下面这样的: o 媒体类型 ("audio") 在"m="行中指定媒体的名字。 o 媒体子类型 (...
  • nkmnkm
  • nkmnkm
  • 2012年01月18日 16:25
  • 6526

SpeexCBR與Opus編碼對比測試

SpeexCBR與Opus編碼對比測試 丟包率 波形圖對比 聽覺 5% Speex與Opus都有個別字出現削波 聽整段語音,...
  • zsJum
  • zsJum
  • 2012年04月06日 17:38
  • 3315

speex和opus的复用形式

opus是要替代speex语音编码的,这里总结一下这两种编码可以复用的形式。 复用到RTP是可以的,以流的形式出去。 复用到文件的形式有OGG,这个可以。 至于这两者复用到TS,我都没有试成功过...
  • qiuchangyong
  • qiuchangyong
  • 2016年03月04日 11:42
  • 994

speex库音频降噪(含代码)

speex库中音频降噪效果不错,应该是应用最广泛的吧,speex库下载地址https://www.speex.org/downloads/,可以直接下载二进制代码使用,像配置OpenCV一样配置spe...
  • fakine
  • fakine
  • 2018年01月31日 11:16
  • 49

Speex 回声消除接口介绍

 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 今天测试了speex中带回声消除模块,效果还可以。 测试环境:网络双工通话,16K采样1...
  • jiaoyangwuze
  • jiaoyangwuze
  • 2016年02月01日 14:35
  • 551

音频编解码speex库的使用方法

Speex是近年来开发出的一套功能强大的语音引擎,能够实现高质量和低比特率的编码。它不仅提供了基于码激励线性预测(CELP)算法的编/解码模块, 而且在其最新发布的版本中还提供了声音预处理和声学回声消...
  • jiangyiaxiu
  • jiangyiaxiu
  • 2013年06月27日 19:11
  • 9101
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 用speex库压缩音频
举报原因:
原因补充:

(最多只允许输入30个字)