Speex 音频编解码

Speex 音频编解码

2010-08-26 17:14 

// 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;

	/*保存字节因此他们可以被speex常规读写*/

	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("%02d,",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;

}

更多0

时间: 2024-10-21 18:07:46

Speex 音频编解码的相关文章

信号-安卓开发 如何将float数组 进行音频编解码 转换成wav音频格式 储存到sd卡内部

问题描述 安卓开发 如何将float数组 进行音频编解码 转换成wav音频格式 储存到sd卡内部 最近正在学习安卓音频相关的一些知识,再SD卡里面读取一个wav音频文件,然后对这个文件进行噪音消除,最后输出的数据都是float格式的,这些数据用matlab中的wavwrite函数转换成wav是没有问题的,但是在安卓上如何将这些数据转换成wav还需要大神们请教,应该需要编解码的过程,如果有做这方面的大神 请知道指导...谢谢了 这段代码是将IFFT处理后的文件储存到res里面,因为是分帧进行的信号

[总结]FFMPEG视音频编解码零基础学习方法--转

ffmpeg编解码学习   目录(?)[-] ffmpeg程序的使用ffmpegexeffplayexeffprobeexe 1 ffmpegexe 2 ffplayexe 3 ffprobeexe ffmpeg库的使用视频播放器 1 ffmpeg库的配置 2 最简单的视频播放器 3 相关结构体的研究 ffmpeg库的使用音频播放器 1 最简单的音频播放器 ffmpeg库的使用一个真正的播放器ffplay 1 真正的播放器 ffmpeg库的使用编码 1 编码 2 转码 ffmpeg源代码分析 F

FFMPEG视音频编解码零基础学习方法

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的"大神",有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在"大神"和初学者之间好像有一个不可逾越的鸿沟."大神"们水平高超,探讨着深奥的问题:而初学者们还停留在入门阶段.究竟是什么原因造成的这种"两极分化"呢?最后,我发现了问题的关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复

Speex手册----编解码介绍

2.1 概念 Before introducing all the Speex features, here are some concepts in speech coding that help better understand the rest of the manual. Although some are general concepts in speech/audio processing, others are specific to Speex 在介绍Speex特性之前,为了便

视音频编解码基本术语及解释

         整理了一些基本视音频术语,用于入门和查询使用. H264: H264是视频的标准,是MPEG4-10,基于内容的高效编码方式. H.264/MPEG-4第10部分,或称AVC(AdvancedVideo Coding,高级视频编码),是一种视频压缩标准,一种被广泛使用的高精度视频的录制.压缩和发布格式.第一版标准的最终草案于2003年5月完成. H.264/MPEG-4 AVC是一种面向块的基于运动补偿的编解码器标准.由ITU-T视频编码专家组与ISO/IEC联合工作组--即动

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

Speex是近年来开发出的一套功能强大的语音引擎,能够实现高质量和低比特率的编码.它不仅提供了基于码激励线性预测(CELP)算法的编/解码模块, 而且在其最新发布的版本中还提供了声音预处理和声学回声消除模块,为保障IP网络中的语音通信质量提供了技术手段.此外,Speex还具有压缩后的比特率 低(2~44 kbps)的特点,并支持多种比特率.这些特点使得Speex特别适合VoIP的系统. 虽然是开源的,但是使用的人还不是很多,网上的资料也很少,下面简单给大家介绍一下如何使用speex的API.  

音频编解码·实战篇(1)PCM转至AAC(AAC编码)

1 下载安装 FAAC 这里的安装过程是在 Mac 和 Linux 上实现的,Windows可以类似参考. wget http://downloads.sourceforge.net/faac/faac-1.28.tar.gz tar zxvf faac-1.28.tar.gz cd faac-1.28 ./configure make sudo make install 如果才用默认的 configure 中的 prefix path,那么安装后的 lib 和 .h 文件分别在/usr/loc

音频编解码标准

  PCMU(G.711U)类型:Audio制定者:ITU-T所需频宽:64Kbps(90.4)特性:PCMU和PCMA都能提供较好的语音质量,但是它们占用的带宽较高,需要64kbps.优点:语音质量优缺点:占用的带宽较高应用领域:voip版税方式:Free备注:PCMU and PCMA都能够达到CD音质,但是它们消耗的带宽也最多(64kbps).如果网络带宽比较低,可以选用低比特速率的编码方法,如G.723或G.729,这两种编码的方法也能达到传统长途电话的音质,但是需要很少的带宽(G723

音频数据编解码——在.NET中使用Speex(附下载)

Speex是一套开源的音频编解码库,最新版本还包含了回音消除和防抖动等功能,如果我们想开发语音聊天或视频会议这样的系统,Speex将是一个不错的选择.到 http://www.speex.org可以下载Speex的源码(编译后的dll为libspeex.dll),最新版本为1.2.不过源码是用C++开发的,直接在.NET中使用会有诸多不便,为此,我用C#将其封装,使得编解码的调用相当简单. 由于Speex原始导出的API不是很方便C#调用,所以,在用C#封装之前,先要用C++对Speex的原始A