嵌入式 A-LawPCM转换为wav格式

原创 2013年12月02日 14:56:25

 

(此文来自互联网,写得比较粗俗易懂,我补充了一些注释)

这里没有做编码转换, 只是给LAW PCM数据加上了wav文件头。

A law PCM 和unsigned PCM互相转换可以参考G711手册, 或者留言找我。

PCM(脉冲编码调制),是国际电信联盟订定出来的一套语音压缩标准,主要用于电话。它主要用脉冲编码调制对音频采样,采样率为8k每秒。它利用一个64Kbps 未压缩通道传输语音讯号。起压缩率为1:2,即把16位数据压缩成8位。G.711是主流的波形声音编解码器。

  G.711 标准下主要有两种压缩算法。一种是µ-law algorithm(又称often u-law, ulaw, mu-law),主要运用于北美和日本;另一种是A-lawalgorithm,主要运用于欧洲和世界其他地区。

中国使用的是A-law algorithm。

公司的HXD09语音交换机使用的就是A-lawPCM作为语音文件存储格式,但是没有加入wav文件头, 不能直接用Media Player播放,非常不方便。

如果是LINUX操作系统,加上下面两句

typedef unsigned short WORD;
typedef unsigned long DWORD;

其实给这些文件加上wav文件头即可用Media Player播放, 很简单吧。

// Define WAVE File Header
struct tagHXD_WAVFLIEHEAD
{
CHAR RIFFNAME[4];
DWORD nRIFFLength;
CHAR WAVNAME[4];
CHAR FMTNAME[4];
DWORD nFMTLength;
WORD nAudioFormat;
WORD nChannleNumber;
DWORD nSampleRate;
DWORD nBytesPerSecond;
WORD nBytesPerSample;
WORD nBitsPerSample;
CHAR DATANAME[4];
DWORD nDataLength;
};

typedef tagHXD_WAVFLIEHEAD HXD_WAVFLIEHEAD;

int a_law_pcm_to_wav(const char *pcm_file, const char*wav)
{
// 开始准备WAV的文件头
HXD_WAVFLIEHEAD DestionFileHeader;
DestionFileHeader.RIFFNAME[0] = 'R';
DestionFileHeader.RIFFNAME[1] = 'I';
DestionFileHeader.RIFFNAME[2] = 'F';
DestionFileHeader.RIFFNAME[3] = 'F';

DestionFileHeader.WAVNAME[0] = 'W';
DestionFileHeader.WAVNAME[1] = 'A';
DestionFileHeader.WAVNAME[2] = 'V';
DestionFileHeader.WAVNAME[3] = 'E';

DestionFileHeader.FMTNAME[0] = 'f';
DestionFileHeader.FMTNAME[1] = 'm';
DestionFileHeader.FMTNAME[2] = 't';
DestionFileHeader.FMTNAME[3] = 0x20;
DestionFileHeader.nFMTLength = 16; // 表示 FMT 的长度
DestionFileHeader.nAudioFormat = 6; //这个表示a law PCM

DestionFileHeader.DATANAME[0] = 'd';
DestionFileHeader.DATANAME[1] = 'a';
DestionFileHeader.DATANAME[2] = 't';
DestionFileHeader.DATANAME[3] = 'a';
DestionFileHeader.nBitsPerSample = 8;
DestionFileHeader.nBytesPerSample = 1; //
DestionFileHeader.nSampleRate = 8000; //
DestionFileHeader.nBytesPerSecond = 8000;
DestionFileHeader.nChannleNumber = 1;

// 文件头的基本部分
int nFileLen = 0;
int nSize = sizeof(DestionFileHeader);

FILE *fp_s = NULL;
FILE *fp_d = NULL;

fp_s = fopen(pcm_file, "rb");
if (fp_s == NULL)
return -1;

fp_d = fopen(wav, "wb+");
if (fp_d == NULL)
return -2;


int nWrite = fwrite(&DestionFileHeader, 1, nSize, fp_d);//将文件头写入wav文件
if (nWrite != nSize)
{
fclose(fp_s);
fclose(fp_d);
return -3;
}

while( !feof(fp_s))
{
char readBuf[4096];
int nRead = fread(readBuf, 1, 4096, fp_s); //将pcm文件读到readBuf
if (nRead > 0)
{
fwrite(readBuf, 1, nRead, fp_d); //将readBuf文件的数据写到wav文件
}

nFileLen += nRead;
}
fseek(fp_d, 0L, SEEK_SET); //将读写位置移动到文件开头

DestionFileHeader.nRIFFLength = nFileLen - 8 + nSize;
DestionFileHeader.nDataLength = nFileLen;
nWrite = fwrite(&DestionFileHeader, 1, nSize, fp_d);//重新将文件头写入到wav文件
if (nWrite != nSize)
{
fclose(fp_s);
fclose(fp_d);
return -4;
}

fclose(fp_s);
fclose(fp_d);

return nFileLen;
}

加上了wave文件头, 就可以直接用winamp打开了。

Raw PCM转换为wav格式

Raw PCM转换为wav格式    这里没有做编码转换, 只是给RAW PCM数据加上了wav文件头。 A law PCM 和unsigned PCM互相转换可以参考G711手册, 或者留言...
  • xuyeyan
  • xuyeyan
  • 2013年02月28日 11:25
  • 8210

使用libfaac转换WAV文件为AAC文件

使用libfaac转换WAV文件为AAC文件,需要注意两点: 1、当faacEncEncode返回0的时候,可能是正在缓冲,所以需要重新执行编码,直到成功。 2、WAV文件和AAC文件必须采样率、...
  • u011711997
  • u011711997
  • 2016年10月16日 13:21
  • 984

即时通讯收发语音,兼容安卓wav和amr格式互转

这几天公司做了一个即时通讯的简单聊天软件,要求可以收发文子、图片、语音。由于公司缺乏socket相关方面的人才,考虑到开发周期,公司最后决定用http定时发送请求的方式实现消息的接受,这种方法虽然不太...
  • sharmir
  • sharmir
  • 2016年01月21日 10:48
  • 2197

pcm转wav的方法及代码示例

pcm文件转wav文件 pcm wav 格式转换
  • lzyzuixin
  • lzyzuixin
  • 2016年07月06日 12:03
  • 3681

HTK中的wav文件格式

HTK3.4程序员手册(1.1)--HTK中的wav文件格式 by 云龙  1.1.1 HTK中的Wav文件格式 HTK3.4支持wav文件格式称为HTK格式。头部为HTKhdr结构,占...
  • tanningzhong
  • tanningzhong
  • 2015年01月12日 15:00
  • 962

iOS录音wav caf 及mp3转码 音频的曲线

一 : 定义一个全局变量AVAudioRecorder的录音对象,并启动录音 PCM格式设置如下: //设置属性的字典 recordSetting = [[NSMutableDictionary a...
  • Akries
  • Akries
  • 2015年05月25日 14:17
  • 3757

利用ffmpeg将微信speex格式转为wav或mp3

利用speex_decode插件进行微信speex文件转换为wav格式的音频文件1.服务器上安装speex库yum install speex-devel2.下载speex源码进入路径后make;ma...
  • lyflyyvip
  • lyflyyvip
  • 2017年07月24日 19:03
  • 1778

PCM到WAV的转换(java)

其实WAV只是PCM文件加上相关的文件头和描述信息,不算复杂。这段程序参考了网上的一些实现(C/C++),修改了其中的一些错误,比如转换后的文件能够播放但是时间长度是错误的;或者不能拖动等等。 ...
  • u013611548
  • u013611548
  • 2016年12月27日 15:19
  • 1134

PCM、WAV格式介绍及用C语言实现PCM转WAV

1、PCM格式介绍: PCM(Pulse Code Modulation)也被称为 脉码编码调制。PCM中的声音数据没有被压缩,如果是单声道的文件,采样数据按时间的先后顺序依次存入。(它的基...
  • u010011236
  • u010011236
  • 2016年11月03日 22:01
  • 4300

MP3转换为WAV

一:MP3转换为WAV function acmDriverEnumCallback(hadid: HACMDRIVERID; dwInstance: DWORD; fdwSupport: DW...
  • fghydx
  • fghydx
  • 2014年01月03日 12:11
  • 1155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 A-LawPCM转换为wav格式
举报原因:
原因补充:

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