关于pcm音频头与a-law音频头的互换代码

在一个项目中有一个关于不同音频播放的问题,需要进行转换。今天突然要用到找了好久,觉得该代码蛮有意义的,记录下以免下次想用找不到。

 

/********************************************************************
 function:  g.711 decoder and encoder
 ********************************************************************/

//hyy add 2010.4.9 begin
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>

typedef unsigned short uint16;
typedef unsigned int uint32;

#pragma pack(push, 1)

// pcm文件头
typedef struct
{
	uint32 ChunkID;             //00H 4 char "RIFF"标志
	uint32 ChunkSize;           //04H 4 long int 文件长度 文总长-8
	uint32 Format;              //08H 4 char "WAVE"标志
	uint32 SubChunk1ID;         //0CH 4 char "fmt "标志
	uint32 SubChunk1Size;       //10H 4 0x10000000H(PCM)过渡字节(不定)
	uint16 AudioFormat;         //14H 2 int 格式类别(0x01H为PCM形式的声音数据) 0x0100H
	uint16 NumChannels;         //16H 2 int 通道数,单声道为1,双声道为2
	uint32 SampleRate;          //18H 4 int 采样率(每秒样本数),表示每个通道的播放速度,
	uint32 ByteRate;            //1CH 4 long int 波形音频数据传送速率,其值Channels×SamplesPerSec×BitsPerSample/8
	uint16 BlockAlign;          //20H 2 int 数据块的调整数(按字节算的),其值为Channels×BitsPerSample/8
	uint16 BitsPerSample;       //22H 2 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
	uint32 DataTag;           	//24H 4 char 数据标记符"data"
	uint32 DataLen;							//28H 4 long int 语音数据的长度(文长-44)
}PCM_HEAD, *PPCM_HEAD;

// a-law文件头
typedef struct
{
	uint32 ChunkID;             //00H 4 char "RIFF"标志
	uint32 ChunkSize;           //04H 4 long int 文件长度 文总长-8
	uint32 Format;              //08H 4 char "WAVE"标志
	uint32 SubChunk1ID;         //0CH 4 char "fmt "标志
	uint32 SubChunk1Size;       //10H 4 0x12000000H(ALAW)
	uint16 AudioFormat;         //14H 2 int 格式类别 0x0600H
	uint16 NumChannels;         //16H 2 int 通道数,单声道为1,双声道为2
	uint32 SampleRate;          //18H 4 int 采样率(每秒样本数),表示每个通道的播放速度,
	uint32 ByteRate;            //1CH 4 long int 波形音频数据传送速率,其值Channels×SamplesPerSec×BitsPerSample/8
	uint16 BlockAlign;          //20H 2 int 数据块的调整数(按字节算的),其值为Channels×BitsPerSample/8
	//uint16 BitsPerSample;       //22H 2 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
	uint32 BitsPerSample;       //22H 2 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
	uint32 WaveFact;						//26H 4 char "fact"标志
	uint32 Temp1;								//2AH 4 0x04000000H
	uint32 Temp2;								//2EH 4 0x00530700H
	uint32 DataTag;           	//32H 4 char 数据标记符"data"
	uint32 DataLen;							//36H 4 long int 语音数据的长度(文长-58)
}ALAW_HEAD, *PALAW_HEAD;

#pragma pack(pop)

//hyy add 2010.4.9 end

#define	SIGN_BIT	(0x80)		/* Sign bit for a A-law byte. */
#define	QUANT_MASK	(0xf)		/* Quantization field mask. */
#define	NSEGS		(8)			/* Number of A-law segments. */
#define	SEG_SHIFT	(4)			/* Left shift for segment number. */
#define	SEG_MASK	(0x70)		/* Segment field mask. */

#define	BIAS		(0x84)		/* Bias for linear code. */
#define CLIP        8159

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值