Speex 音频编解码 示例

2024-02-10 19:08
文章标签 音频 示例 编解码 speex

本文主要是介绍Speex 音频编解码 示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

地址:http://wmnmtm.blog.163.com/blog/static/38245714201110801617165/

Ubuntu下编译gcc -o speexdec speexdec.c -lspeex -logg

// demo.cpp : Defines the entry point for the console application.  
//  
#include "stdafx.h"  
#include <speex/speex.h>  
#include <stdio.h>   
#include <ostream>  #include <speex/speex_preprocess.h>  
#include <speex/speex_echo.h>   
#pragma comment(lib,"libspeexdsp.lib")   
#define FRAME_SIZE 160  
int main(int argc, char **argv)  
{  char *inFile;  FILE *fin,*fout1,*fout2,*fout3;  short in[FRAME_SIZE];  short out[FRAME_SIZE];    float input[FRAME_SIZE];  float output[FRAME_SIZE];     char cbits[200];  int nbBytes;  void *stateEncode;  void *stateDecode;  SpeexBits bitsEncode;  SpeexBits bitsDecode;     int i, tmp;  //新建一个新的编码状态在窄宽(narrowband)模式下  stateEncode = speex_encoder_init(&speex_nb_mode);  stateDecode = speex_decoder_init(&speex_nb_mode);  //设置质量为8(15kbps)  tmp=0;  speex_encoder_ctl(stateEncode, SPEEX_SET_VBR, &tmp);  float q=4;  speex_encoder_ctl(stateEncode, SPEEX_SET_VBR_QUALITY, &q);  speex_encoder_ctl(stateEncode, SPEEX_SET_QUALITY, &tmp);  inFile = argv[1];  fin = fopen("c:/demo.pcm", "rb");  fout1 = fopen("c:/demo_speex.raw", "wb");  fout2 = fopen("c:/demo1.pcm", "wb");  fout3 = fopen("c:/demo_slience.pcm", "wb");  //初始化结构使他们保存数据  speex_bits_init(&bitsEncode);  speex_bits_init(&bitsDecode);  int ret;  int j=0;  SpeexPreprocessState * m_st;  SpeexEchoState *echo_state;   m_st=speex_preprocess_state_init(160, 8000);  
//  echo_state = speex_echo_state_init(160, 8000);   int denoise = 1;  int noiseSuppress = -25;  speex_preprocess_ctl(m_st, SPEEX_PREPROCESS_SET_DENOISE, &denoise); //降噪  speex_preprocess_ctl(m_st, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &noiseSuppress); //设置噪声的dB  int agc = 1;  q=24000;  //actually default is 8000(0,32768),here make it louder for voice is not loudy enough by default. 8000  speex_preprocess_ctl(m_st, SPEEX_PREPROCESS_SET_AGC, &agc);//增益  speex_preprocess_ctl(m_st, SPEEX_PREPROCESS_SET_AGC_LEVEL,&q);  int vad = 1;  int vadProbStart = 80;  int vadProbContinue = 65;  speex_preprocess_ctl(m_st, SPEEX_PREPROCESS_SET_VAD, &vad); //静音检测  speex_preprocess_ctl(m_st, SPEEX_PREPROCESS_SET_PROB_START , &vadProbStart); //Set probability required for the VAD to go from silence to voice   speex_preprocess_ctl(m_st, SPEEX_PREPROCESS_SET_PROB_CONTINUE, &vadProbContinue); //Set probability required for the VAD to stay in the voice state (integer percent)   while (1)  {  memset(out,0,FRAME_SIZE*sizeof(short));  //读入一帧16bits的声音  j++;  int r=fread(in, sizeof(short), FRAME_SIZE, fin);  if (r<FRAME_SIZE)  break;  //把16bits的值转化为float,以便speex库可以在上面工作  spx_int16_t * ptr=(spx_int16_t *)in;  if (speex_preprocess_run(m_st, ptr))//预处理 打开了静音检测和降噪  {  printf("speech,");  fwrite(in, sizeof(short), FRAME_SIZE, fout3);  }  else  {  printf("slience,");  fwrite(out, sizeof(short), FRAME_SIZE, fout3);  }  for (i=0;i<FRAME_SIZE;i++)  input[i]=in[i];  //清空这个结构体里所有的字节,以便我们可以编码一个新的帧  speex_bits_reset(&bitsEncode);  //对帧进行编码  ret=speex_encode(stateEncode, input, &bitsEncode);  //把bits拷贝到一个利用写出的char型数组  nbBytes = speex_bits_write(&bitsEncode, cbits, 200);  fwrite(cbits, sizeof(char), nbBytes, fout1);  printf("d,",nbBytes);  //清空这个结构体里所有的字节,以便我们可以编码一个新的帧  speex_bits_reset(&bitsDecode);  //将编码数据如读入bits  speex_bits_read_from(&bitsDecode, cbits, nbBytes);    //对帧进行解码  ret = speex_decode(stateDecode, &bitsDecode,output);  for (i=0;i<FRAME_SIZE;i++)  out[i]=output[i];  fwrite(out, sizeof(short), FRAME_SIZE, fout2);  }  //释放编码器状态量  speex_encoder_destroy(stateEncode);  //释放bit_packing结构  speex_bits_destroy(&bitsEncode);  speex_decoder_destroy(stateDecode);  //释放bit_packing结构  speex_bits_destroy(&bitsDecode);  fclose(fin);  fclose(fout1);  fclose(fout2);  fclose(fout3);  return 0;  }  


这篇关于Speex 音频编解码 示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/697863

相关文章

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

MySQL数据库实现批量表分区完整示例

《MySQL数据库实现批量表分区完整示例》通俗地讲表分区是将一大表,根据条件分割成若干个小表,:本文主要介绍MySQL数据库实现批量表分区的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录一、表分区条件二、常规表和分区表的区别三、表分区的创建四、将既有表转换分区表脚本五、批量转换表为分区

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Spring Boot 集成 Solr 的详细示例

《SpringBoot集成Solr的详细示例》:本文主要介绍SpringBoot集成Solr的详细示例,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录环境准备添加依赖配置 Solr 连接定义实体类编写 Repository 接口创建 Service 与 Controller示例运行