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

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动