资源简介
有时DUMP下了PCM格式的数据流,要在电脑或者其它设备上听,验证其声音是否正确,该小程序就是给PCM数据流添加一个WAV的文件头,让播放器可以以WAV格式正常播放PCM数据.
例子中代码固定写了44.1K采样,双声道,量化BIT为16,如果格式不一致,改宏定义即可.
代码片段和文件信息
// AddPcmFileHeader.cpp : 定义控制台应用程序的入口点。
//
#include “stdafx.h“
#include
#include
#include
//pcm文件的声道数
#define PCM_CHANNEL_NUM 2
//pcm文件的采样率
#define PCM_SAMPLE_RATE 44100
// 每次采样占用的位数 8/16/32等
#define PCM_SAMPLE_BITS 16
/*
* wav 文件格式
------------------------------------------------
| RIFF WAVE Chunk |
| ID = ‘RIFF‘ |
| RiffType = ‘WAVE‘ |
------------------------------------------------
| Format Chunk |
| ID = ‘fmt ‘ |
------------------------------------------------
| Fact Chunk(optional) |
| ID = ‘fact‘ | (此Chunk可选)
------------------------------------------------
| Data Chunk |
| ID = ‘data‘ |
------------------------------------------------
*/
//wav头的结构如下所示:
typedef struct
{
char fccID[4];
unsigned long dwSize;
char fccType[4];
}HEADER; //RIFF WAVE Chunk
typedef struct
{
char fccID[4];
unsigned long dwSize;
unsigned short wFormatTag;
unsigned short wChannels;
unsigned long dwSamplesPerSec;
unsigned long dwAvgBytesPerSec;
unsigned short wBlockAlign;
unsigned short uiBitsPerSample;
}FMT; //Format Chunk
typedef struct
{
char fccID[4];
unsigned long dwSize;
}DATA; //Data Chunk
//以上是wav头文件
int _tmain(int argc _TCHAR* argv[])
{
//以下是为了建立.wav头而准备的变量
HEADER pcmHEADER;
FMT pcmFMT;
DATA pcmDATA;
unsigned short m_pcmData; //读入.pcm和写入文件.wav数据变量
FILE *fp*fpCpy;
if(argc!=2)
{
printf(“ Usage: %s PCM_FILE\n“);
return 1;
}
if((fp=fopen(argv[1] “rb “)) == NULL) //读取文件
{
printf( “打开pcm文件出错 \n“);
exit(0);
}
if((fpCpy=fopen(“output_pcm.wav“ “wb+“)) == NULL) //为转换建立一个新文件
{
fclose(fp);
printf( “创建wav文件出错\n “);
exit(0);
}
//以下是创建wav头的HEADER;但.dwsize未定,因为不知道Data的长度。
strncpy(pcmHEADER.fccID “RIFF“4);
//pcmHEADER.dwsize==?
strncpy(pcmHEADER.fccType “WAVE“ 4);
fseek(fpCpysizeof(HEADER)SEEK_CUR); //跳过HEADER的长度,以便下面继续写入wav文件的数据;
//以上是创建wav头的HEADER;
if(ferror(fpCpy))
{
printf( “error!\n “);
}
//以下是创建wav头的FMT;
strncpy(pcmFMT.fccID “fmt “4);
pcmFMT.dwSize=16;
pcmFMT.wFormatTag=1;
pcmFMT.wChannels=PCM_CHANNEL_NUM; //几声道此处为2声音左右立体声
pcmFMT.dwSamplesPerSec=PCM_SAMPLE_RATE; //采样率44.1KHz
//每个采样需要的bit数
pcmFMT.uiBitsPerSample=PCM_SAMPLE_BITS;
// 每秒所需字节数 (采样率*声道数*每个采样所需的BIT /8 )
pcmFMT.dwAvgBytesPerSec=pcmFMT.dwSamplesPerSec * pcmFMT.wChannels * pcmFMT.uiBitsPerSample / 8;
//数据块对齐单位(每个采样需要的字节数: 采样位*声道数/8)
pcmFMT.wB
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4401 2014-04-23 11:23 给PCM数据流加WAV格式文件头\AddPcmFileHeader\AddPcmFileHeader.cpp
文件 4178 2014-04-23 10:04 给PCM数据流加WAV格式文件头\AddPcmFileHeader\AddPcmFileHeader.vcproj
文件 1004 2014-04-23 09:23 给PCM数据流加WAV格式文件头\AddPcmFileHeader\ReadMe.txt
文件 221 2014-04-23 09:23 给PCM数据流加WAV格式文件头\AddPcmFileHeader\stdafx.cpp
文件 378 2014-04-23 09:23 给PCM数据流加WAV格式文件头\AddPcmFileHeader\stdafx.h
文件 913 2014-04-23 09:23 给PCM数据流加WAV格式文件头\AddPcmFileHeader.sln
..A..H. 10752 2014-04-23 15:45 给PCM数据流加WAV格式文件头\AddPcmFileHeader.suo
目录 0 2014-04-24 17:09 给PCM数据流加WAV格式文件头\AddPcmFileHeader
目录 0 2014-04-24 17:09 给PCM数据流加WAV格式文件头
----------- --------- ---------- ----- ----
21847 9
- 上一篇:leveldb实现解析
- 下一篇:sourceinsight4破解说明.rar
相关资源
- arduino JSON数据格式库
- 纯静音文件,三种格式mp3oggwav,30秒时
- 全国研究生数学建模竞赛论文格式
- 斯坦福兔.7z点云扫描文件 pcd格式
- 一维非定常热传导方程FTCS格式Fortra
- 使用 FME 将勘测定界坐标交换格式文本
- IDL,气象站点逐小时数据处理,转换
- adxl345 pcb库文件 altium格式
- SD卡格式化 低格 SD卡低格工具合集拯
- 厦门09年最新矢量地图(MapInfo格式)
- unity gif 图片格式 播放动画插件
- 基于QT的MP3压缩算法
- [MMD格式转FBX插件]Blender_mmd_tools 亲测
- 40种常用差分格式的源代码Fortran语言
- seed--数据格式说明
- 地图ICON SVG标记一个标记的svg格式文件
- system.new.dat.br解包打包工具
- 中国矿业大学学报论文格式
- 直播盒子采集器带json格式
- 中国地图,带南海,九段线,shp格式
- 三星4510PCB图纸,protel格式
- 将CSV格式转换成xtszoo时间序列格式
- MIF 转 SHP格式
- vgg19网络模型百度云npy和mat格式各一份
- 全国省市地区json格式数据文件
- unity地形转obj格式导出插件
- yuv格式播放器
- swf格式的时钟 flash小时钟
- 简单图书管理系统doc格式
- 采用PCM编码原理及FPGA编程技术实现
评论
共有 条评论