#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void main()
{
 //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头文件

//以下是为了建立.wav头而准备的变量
 HEADER  pcmHEADER;
 FMT  pcmFMT;
 DATA pcmDATA;
 //以上是为了建立.wav头而准备的变量

unsigned   short   m_pcmData;                       //读入.pcm和写入文件.wav数据变量
 FILE   *fp,*fpCpy;
 
 if((fp=fopen("m_Filename",   "rb "))   ==   NULL)  //读取文件
 {
  printf( "打开pcm文件出错 \n");      
  exit(0);
 }  
 
 if((fpCpy=fopen("TranName",   "wb+ "))   ==   NULL)  //为转换建立一个新文件
 {
  printf( "创建wav文件出错\n ");      
  exit(0);
 }

//以下是创建wav头的HEADER;但.dwsize未定,因为不知道Data的长度。
 strcpy(pcmHEADER.fccID, "RIFF");           
 //pcmHEADER.dwsize==?
 strcpy(pcmHEADER.fccType, "WAVE");
 fseek(fpCpy,sizeof(HEADER),1); //跳过HEADER的长度,以便下面继续写入wav文件的数据;
 //以上是创建wav头的HEADER;

if(ferror(fpCpy))
 {  
  printf( "error!\n ");              
 }

//以下是创建wav头的FMT;
 strcpy(pcmFMT.fccID, "fmt   ");
 pcmFMT.dwSize=16;
 pcmFMT.wFormatTag=1;
 pcmFMT.wChannels=1;
 pcmFMT.dwSamplesPerSec=4000;
 pcmFMT.dwAvgBytesPerSec=pcmFMT.dwSamplesPerSec*sizeof(m_pcmData);
 pcmFMT.wBlockAlign=2;
 pcmFMT.uiBitsPerSample=16;  
 //以上是创建wav头的FMT;    
 
 
 fwrite(&pcmFMT,sizeof(FMT),1,fpCpy); //将FMT写入.wav文件;
 //以下是创建wav头的DATA;   但由于DATA.dwsize未知所以不能写入.wav文件
 strcpy(pcmDATA.fccID, "data ");
 //以上是创建wav头的DATA;
    
 
 pcmDATA.dwSize=0; //给pcmDATA.dwsize   0以便于下面给它赋值
 fseek(fpCpy,sizeof(DATA),1); //跳过DATA的长度,以便以后再写入wav头的DATA;
 fread(&m_pcmData,sizeof(unsigned   short),1,fp); //从.pcm中读入数据
 
 while(!feof(fp)) //在.pcm文件结束前将他的数据转化并赋给.wav;
 {
  
  pcmDATA.dwSize+=2; //计算数据的长度;每读入一个数据,长度就加1  
  fwrite(&m_pcmData,sizeof(unsigned   short),1,fpCpy); //将数据写入.wav文件;
  fread(&m_pcmData,sizeof(unsigned   short),1,fp); //从.pcm中读入数据
 }
 
 fclose(fp); //关闭文件
 pcmHEADER.dwSize=44+pcmDATA.dwSize;   //根据pcmDATA.dwsize得出pcmHEADER.dwsize的值 
 rewind(fpCpy); //将fpCpy变为.wav的头,以便于写入HEADER和DATA;
 fwrite(&pcmHEADER,sizeof(HEADER),1,fpCpy); //写入HEADER
 fseek(fpCpy,sizeof(FMT),1); //跳过FMT,因为FMT已经写入
 fwrite(&pcmDATA,sizeof(DATA),1,fpCpy);   //写入DATA; 
 fclose(fpCpy);   //关闭文件

return;

}

给pcm格式文件加wav文件头的更多相关文章

  1. 将PCM格式存储成WAV格式文件

    将PCM格式存储成WAV格式文件 WAV比PCM多44个字节(在文件头位置多) 摘自:https://blog.csdn.net/u012173922/article/details/78849076 ...

  2. 【CTF杂项】常见文件文件头文件尾格式总结及各类文件头

    文件头文件尾总结 JPEG (jpg), 文件头:FFD8FF 文件尾:FF D9PNG (png), 文件头:89504E47 文件尾:AE 42 60 82GIF (gif), 文件头:47494 ...

  3. 各种常见文件的hex文件头

    我们在做ctf时,经常需要辨认各种文件头,跟大家分享一下一些常见的文件头.   扩展名 文件头标识(HEX) 文件描述 123 00 00 1A 00 05 10 04 Lotus 1-2-3 spr ...

  4. 在py文件中设置文件头

    在写python文件的时候有时需要记录作者.创建时间等时间,因此可以给python文件设置文件头,这里以PyCharm为例介绍设置步骤: 1. 打开PyCharm,依次点击Setting-----Ed ...

  5. VS调试时JSON格式文件加载不了

    在使用VS2012进行调试时发现加载数据为JSON格式的都加载不了,应该是MIME类型没有正确设置的问题. 直接通过浏览器地址栏访问时会收到提示,根据提示在IIS EXPRESS的安装目录下面执行一条 ...

  6. Dev c++在新建文件中插入文件头

    在菜单栏中依次点击Tools->Editor Options->Snippets->Default Source 勾选Insert the following code into e ...

  7. ctfhub技能树—文件上传—文件头检查

    打开靶机 尝试上传一个php文件 抓包修改 放包 制作图片马 上传图片马,并修改文件类型为png 测试连接 查找flag 成功拿到flag

  8. WAV文件头相关资料

    http://stackoverflow.com/questions/6284651/avaudiorecorder-doesnt-write-out-proper-wav-file-header h ...

  9. wav格式文件、pcm数据

    wav格式文件是常见的录音文件,是声音波形文件格式之一,wav 文件由文件头和数据体两部分组成. 文件头是我们在做录音保存到文件的时候,要存储的文件的说明信息,播放器要通过文件头的相关信息去读取数据播 ...

随机推荐

  1. 最短路径问题——dijkstra算法

    仅谈谈个人对dijkstra的理解,dijkstra算法是基于邻接表实现的,用于处理单源最短路径问题(顺便再提一下,处理单源最短路径问题的还有bellman算法).开辟一个结构体,其变量为边的终点和边 ...

  2. python ftplib.FTP 获取当前路径下所有目录

    FTP 模块里有一个dir函数,可以打印出当前路径下所有文件,但是这个函数没有返回值,只是打印出来. 还有一个nlst函数,可以返回一个文件名的列表,但是只有文件名,没有详细信息,无法判断是否是目录. ...

  3. ✡ leetcode 167. Two Sum II - Input array is sorted 求两数相加等于一个数的位置 --------- java

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  4. Hadoop及其相关组件简介

    一.大数据介绍 1.大数据指的是所涉及的数据量规模巨大到无法通过人工,在合理时间内达到截取.管理.处理.并整理成为人类所能解读的形式的信息. 2.大数据,可帮助我们能察觉商业趋势.判断研究质量.避免疾 ...

  5. phpwind之关闭账号通

    phpwind的账号通功能早就失效了,但是首页的链接一直存在,造成了很不好的影响 但是后台打开账号通功能又打不开,所以想到了在前端的模板中通过屏蔽这部分代码的方法隐藏掉这个功能在首页的显示 1.打开/ ...

  6. c#防止多次运行代码收集

    1.原文:经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行.所以只限于用在单用户环境,还是不太完美. class Program { [STAThread] ...

  7. MySql数据库索引原理

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...

  8. kail-linux my need

    一  系统安装配置部分: 1. 安装:WPS Office wget  http://wdl.cache.ijinshan.com/wps/download/Linux/unstable/wps-of ...

  9. 淘宝ip库接口调用

    function ip($ip) {     $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;     $ipi ...

  10. SoftEnther VPN 在Window的使用

    1.首先下载SoftEnther VPN Client 下载地址 2. 下载后,执行vpngate-client-×××.exe 文件 选择安装一个软件部分: SoftEnther VPN Clien ...