资源简介
有时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
相关资源
- 三星DDR800内存条PCB文件和原理图
- ply格式文件的读写程序
- 美赛论文MCM两个word模板 论文格式 w
- 武汉大学本科生论文格式自动排版工
- 莱卡 全站仪数据格式转换程序,有源
- 项目周报格式(excel格式报表)
- 一个读取地震数据seg2或dat格式的程序
- C 源码 画出wav文件声音数据的波形曲
-
图片和xm
l格式互换 - 将yuv各种格式的图片转换为jpg格式的
- 提取各种NEMA0183格式数据的类
- 成都MAPINFO格式电子地图
- 声音文件播放程序.可以播放WAV文件并
- 经典wav音乐,特别收录
- DataGridView财务金额格式显示
- EXCEL文件转换成固定的格式的文本格式
- PDF格式的白话孙子兵法
- 超强内存卡格式化工具uFormat
- HP-U盘格式化启动盘工具(内附DOS7.1)
- 索尼SONY VPCM125JC网卡驱动程序 v6.0.14
- EPUB格式转换为MOBI亲测可用
- stm32的DAC播放音乐文件
- ts格式视频
- notepad++ json格式化插件
-
notepad++ 对比插件 xm
l格式化插件 -
Notepad++xm
l格式化插件和json格式化插 - S32K144使用printf格式化输出
- EXCEL函数手册.chm格式
- Intel® Parallel Studio XE 2016 Update 1 专业
- 基于V4L2的视频采集,能够采集YUVJPE
评论
共有 条评论