嵌入式 A-LawPCM转换为wav格式
来源:互联网 发布:重大网络教育学院 编辑:程序博客网 时间:2024/06/05 00:12
(此文来自互联网,写得比较粗俗易懂,我补充了一些注释)
这里没有做编码转换, 只是给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打开了。
- 嵌入式 A-LawPCM转换为wav格式
- wav格式音频文件转换为Mp3格式
- Raw PCM转换为wav格式
- unity wav 格式音频转换为二进制文件
- IVR导航语音转换,wav格式转换为gsm
- 转换 wav,ape,flac 音乐为 mp3,m4a(mp4) 格式
- MP3转换为WAV
- ffmpeg命令转音乐为wav格式,wav格式与PCM数据相互转换,ffplay播放PCM数据
- pcm 格式 转换成 wav
- ogg与wav格式转换
- pcm 格式 转换成 wav
- PCM格式保存为wav
- 用 python 脚本,把当前目录及子目录下的 wav 音频文件转换为 flac 格式
- WAV格式音频转G.711A
- G729编码导出为wav格式
- PCM 转换为 WAV (java)
- java wav文件转换为mp3
- 嵌入式 wave文件(*.wav)格式、PCM数据格式收藏
- 嵌入式 linux下cdev详解
- 嵌入式 globalmem设备驱动ioctl()函数的实现
- linux的文本书写及命令
- 嵌入式 MII和RMII接口详介
- 嵌入式 实现逐行读取txt
- 嵌入式 A-LawPCM转换为wav格式
- 嵌入式 WAV格式常见的几种压缩形式(compression code)
- 嵌入式 WAV中包含G711文件头有关问题
- 嵌入式 ADPCM压缩算法
- 嵌入式 PCM WAVE格式详解及用C语言实现wave文件的读取
- 嵌入式 wave文件(*.wav)格式、PCM数据格式收藏
- 嵌入式 linux下svn命令行使用
- 嵌入式 音频相关词汇解释
- 嵌入式 整型ip与点式ip互相转换