• 大小: 7KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: 其他
  • 标签: WAV  格式  PCM  文件头  

资源简介

有时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


评论

共有 条评论