转载:WAV header

转自:http://www.cnblogs.com/CoderTian/p/6657844.html

WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。WAVE文件通常只是一个具有单个“WAVE”块的RIFF文件,该块由两个子块(”fmt”子数据块和”data”子数据块),它的格式如下图所示

该格式的实质就是在PCM文件的前面加了一个文件头,每个字段的的含义为

typedef struct{
char ChunkID[4];//内容为"RIFF"
unsigned long ChunkSize;//存储文件的字节数(不包含ChunkID和ChunkSize这8个字节)
char Format[4];//内容为"WAVE"
}WAVE_HEADER;
typedef struct{
char Subchunk1ID[4];//内容为"fmt"
unsigned long Subchunk1Size;//存储该子块的字节数(不含前面的Subchunk1ID和Subchunk1Size这8个字节)
unsigned short AudioFormat;//存储音频文件的编码格式,例如若为PCM则其存储值为1,若为其他非PCM格式的则有一定的压缩。
unsigned short NumChannels;//通道数,单通道(Mono)值为1,双通道(Stereo)值为2,等等
unsigned long SampleRate;//采样率,如8k,44.1k等
unsigned long ByteRate;//每秒存储的bit数,其值=SampleRate * NumChannels * BitsPerSample/8
unsigned short BlockAlign;//块对齐大小,其值=NumChannels * BitsPerSample/8
unsigned short BitsPerSample;//每个采样点的bit数,一般为8,16,32等。
}WAVE_FMT;
typedef struct{
char Subchunk2ID[4];//内容为“data”
unsigned long Subchunk2Size;//内容为接下来的正式的数据部分的字节数,其值=NumSamples * NumChannels * BitsPerSample/8
}WAVE_DATA;

比如下面的例子

这里是一个WAVE文件的开头72字节,字节显示为十六进制数字: 
52 49 46 46 24 08 00 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 02 00 
22 56 00 00 88 58 01 00 04 00 10 00 64 61 74 61 00 08 00 00 00 00 00 00 
24 17 1e f3 3c 13 3c 14 16 f9 18 f9 34 e7 23 a6 3c f2 24 f2 11 ce 1a 0d 
字段解析:

pcm 加上WAV header的代码实现为

int simplest_pcm16le_to_wave(const char *pcmpath,int channels,int sample_rate,const char *wavepath)
{
typedef struct WAVE_HEADER{
  char fccID[4];
  unsigned long dwSize;
  char fccType[4];
}WAVE_HEADER;
typedef struct WAVE_FMT{
  char fccID[4];
  unsigned long dwSize;
  unsigned short wFormatTag;
  unsigned short wChannels;
  unsigned long dwSamplesPerSec;
  unsigned long dwAvgBytesPerSec;
  unsigned short wBlockAlign;
  unsigned short uiBitsPerSample;
}WAVE_FMT;
typedef struct WAVE_DATA{
  char fccID[4];
  unsigned long dwSize;
}WAVE_DATA;
  if(channels==0||sample_rate==0){
    channels = 2;
    sample_rate = 44100;
  }
  int bits = 16;
  WAVE_HEADER pcmHEADER;
  WAVE_FMT pcmFMT;
  WAVE_DATA pcmDATA;

  unsigned short m_pcmData;
  FILE *fp,*fpout;
  fp=fopen(pcmpath, "rb");
  if(fp == NULL) {
    printf("open pcm file error\n");
    return -1;
  }
  fpout=fopen(wavepath, "wb+");
  if(fpout == NULL) {
    printf("create wav file error\n");
    return -1;
  }
  //WAVE_HEADER
  memcpy(pcmHEADER.fccID,"RIFF",strlen("RIFF"));
  memcpy(pcmHEADER.fccType,"WAVE",strlen("WAVE"));
  fseek(fpout,sizeof(WAVE_HEADER),1);
  //WAVE_FMT
  pcmFMT.dwSamplesPerSec=sample_rate;
  pcmFMT.dwAvgBytesPerSec=pcmFMT.dwSamplesPerSec*sizeof(m_pcmData);
  pcmFMT.uiBitsPerSample=bits;
  memcpy(pcmFMT.fccID,"fmt ",strlen("fmt "));
  pcmFMT.dwSize=16;
  pcmFMT.wBlockAlign=2;
  pcmFMT.wChannels=channels;
  pcmFMT.wFormatTag=1;

  fwrite(&pcmFMT,sizeof(WAVE_FMT),1,fpout);
  //WAVE_DATA;
  memcpy(pcmDATA.fccID,"data",strlen("data"));
  pcmDATA.dwSize=0;
  fseek(fpout,sizeof(WAVE_DATA),SEEK_CUR);
  fread(&m_pcmData,sizeof(unsigned short),1,fp);
  while(!feof(fp)){
    pcmDATA.dwSize+=2;
    fwrite(&m_pcmData,sizeof(unsigned short),1,fpout);
    fread(&m_pcmData,sizeof(unsigned short),1,fp);
  }
  pcmHEADER.dwSize=44+pcmDATA.dwSize;
  rewind(fpout);
  fwrite(&pcmHEADER,sizeof(WAVE_HEADER),1,fpout);
  fseek(fpout,sizeof(WAVE_FMT),SEEK_CUR);
  fwrite(&pcmDATA,sizeof(WAVE_DATA),1,fpout);

  fclose(fp);
  fclose(fpout);
  return 0;
}

时间: 2024-10-13 06:11:06

转载:WAV header的相关文章

vs2010音频文件压缩 调用lame_enc.dll将WAV格式转换成MP3

/* //My_lame.h */ #pragma once#include "stdafx.h"#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string>#include "BladeMP3EncDLL.h"class My_lame{public: My_lame(void); ~My_lame(void); HINSTANC

wav音频文件头解析

1.wav概述 WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! WAV打开工具是WINDO

FFMPEG Tips (2) 如何提取码流的基本信息

本文是我的<FFMPEG Tips>系列的第二篇文章,上篇文章<FFMPEG Tips (1) 如何打印日志>主要分享了如何利用 ffmpeg 库打印日志,而本文则主要分享一下如何利用 ffmpeg 库拿到码流的一些基本信息. 1.  码流中的哪些信息值得关注 ? [ ] 是否包含:音频.视频 [ ] 码流的封装格式 [ ] 视频的编码格式 [ ] 音频的编码格式 [ ] 视频的分辨率.帧率.码率 [ ] 音频的采样率.位宽.通道数 [ ] 码流的总时长 [ ] 其他 Metada

永不消逝的电波(二)HackRF入门:家用无线门铃信号重放

0×00 前言 在第一篇文章:永不消逝的电波(一):无线电入门篇 我们了解了一下无线电的发展史以及无线电的一些物理知识,在第二篇里我们将用HackRF录制家用门铃的无线信号,然后重放门铃信号. 门铃从某宝买的,如图: 0×01 环境搭建: MAC下可以用gqrx和hackrf (需要有Xcode.Mac Port的支持) sudo port install gnuradio sudo port install hackrf sudo port install rtl-sdr sudo port

如何加快web 页面的访问速度

如何提升网页加载速度? 1. 尽量减少HTTP请求 80%的时间是花在  images, stylesheets, scripts, Flash 等等的请求上. 那么最好的提升网站速度的方式就是简化你的设计. . 简化你页面上的元素 . 尽可能的用css代替图片 . 合并多个样式表 放入一个 . 减少scripts脚本,并把他们放在页面底部 2. 减少server响应时间 (1)chrome 页面速度检查插件 pagespeed (2) 在线检测 (3) 使用 YSlow 检测 3. 启用压缩

MP3 Lame 转换 参数 设置(转)

我们在对音频格式的转换中,打交道最多的就是MP3了.如果你能彻底玩转MP3,那么对你的音频创作和对其他音频格式的掌握会有很大的帮助.下面我们给大家介绍MP3制作软件:LAME 要制作出高音质的MP3靠以前广为流传的MP3编码器是不行的.LAME与一般MP3编码器与众不同,它支持几乎所有能够采用到MP3编码中的技术,LAME支持CBR(固定码率)和VBR(动态码率,还有一个效果不是很出众的ABR),LAME是MP3史上具有里程碑意义的软件,LAME是一个Command line程序,象Dos程序一

Kinect 开发 &mdash;&mdash; 录音

不涉及语音识别~~ <Window x:Class="KinectRecordAudio.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Audio Recorder" Height=&quo

转载:ADTS header

转自:http://blog.csdn.net/tx3344/article/details/7414543 1.ADTS是个啥 ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式. 记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽出来送给硬件解码器时,不能播;保存到本地用pc的播放器播时,我靠也不能播.当时崩溃了,后来通过查找资料才知道.一般的AAC解码器都需要把AAC的ES流打包成ADTS的格式,一般是在AAC E

Python3中urllib详细使用方法(header,代理,超时,认证,异常处理) 转载

urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的数据进行保存哦,下面整理了一些关于urllib使用中的一些关于header,代理,超时,认证,异常处理处理方法,下面一起来看看. python3 抓取网页资源的 N 种方法 1.最简单 import urllib.requestresponse = urllib.request.urlopen('http://python.org/')html = res