使用说明

  • 简介
    • 打印文件头信息
    • 调整代码
    • ExtractData.c
    • ExtractData.h

简介

改了一下网上的代码,文件头不再写入txt。使用时,代码中填入wav文件和txt文件路径。wav文件的文件头信息会打印出来,音频数据则写入txt文件。

打印文件头信息

终端中会打印出文件头的一些信息,包括NumChannels(声道数),SampleRate(采样频率),BitsPerSample(每个样本多少位)等。通过更改showWavHead()函数来打印你需要的信息。

调整代码

你需要根据文件头中各种信息来调整代码。

文件头中各项信息的含义见:http://soundfile.sapp.org/doc/WaveFormat/

比如说,我的wav文件BitsPerSample是16,一个声道的一个样本占2字节。如果你的BitsPerSample不是16,你的FileLength(txt文件数据长度,或者叫数据个数)就不是由FileEnd(wav文件字节数)除以2(改成对应的字节数)来得到。

ExtractData.c

#include <stdio.h>
#include "ExtractData.h"#define  W  128             //每次读写文件的数据量  int     FileSet = 0;                //定义一个整型变量, 用于保存fseek函数的返回值
int     FileEnd = 0;                //整个文件的字节数
int     FileLength = 0;             //文件的数据长度。(注:每2个字节作为一个数据 )
short   InputData[W];               //文件读写数据缓冲区  WAVHEADER    FileHeader;            //存文件头的结构体void showWavHead(WAVHEADER Header) {printf("ChunkID: %c%c%c%c\t",Header.ChunkID[0],Header.ChunkID[1],Header.ChunkID[2],Header.ChunkID[3]);printf("ChunkSize: %u\t", Header.ChunkSize);printf("Format: %c%c%c%c\n",Header.Format[0],Header.Format[1],Header.Format[2],Header.Format[3]);printf("FmtChunkID: %c%c%c%c\t",Header.FmtChunkID[0],Header.FmtChunkID[1],Header.FmtChunkID[2],Header.FmtChunkID[3]);printf("FmtChunkSize: %u\t", Header.FmtChunkSize);printf("AudioFormat: %d\t", Header.AudioFormat);printf("NumChannels: %d\t", Header.NumChannels);printf("SampleRate: %u\t", Header.SampleRate);printf("ByteRate: %u\t", Header.ByteRate);printf("BlockAlign: %d\t", Header.BlockAlign);printf("BitsPerSample: %d\n", Header.BitsPerSample);printf("DataChunkID: %c%c%c%c\t", Header.DataChunkID[0],Header.DataChunkID[1],Header.DataChunkID[2],Header.DataChunkID[3]);printf("DataChunkSize: %u\n", Header.DataChunkSize);
}int main() {FILE *Ifp, *txt;    //定义文件读写指针 Ifp = fopen(".wav","rb");    /*以只读方式打开wav文件*/txt = fopen(".txt","w");/* 获得文件字节数,fseek函数将文件内部指针指向文件末尾,ftell函数获取文件内部指针相对于文件头的偏移量,rewind函数将文件内部指针指向文件头 */fseek(Ifp, 0L, SEEK_END);  FileEnd = ftell(Ifp);   printf("total file size: %d bytes \n", FileEnd);   rewind(Ifp);   // 读取文件头,并打印部分信息,wav格式的文件头一般是44个字节,后面是音频数据fread(&FileHeader, 1, sizeof(WAVHEADER), Ifp);showWavHead(FileHeader);// 读取数据。这里的数据大小是2字节,按照实际格式改。while循环每次读写 W 个数据量,for循环写最后剩余的FileLength = FileEnd / 2;while (FileLength >= W) {fread(InputData, sizeof(short), W, Ifp);for (int i = 0; i < W; i++) {fprintf(txt,"%d\n",InputData[i]);}FileLength -= W;}fread(InputData, sizeof(short), FileLength, Ifp); for (int i = 0; i < FileLength; i++) {fprintf(txt, "%d\n", InputData[i]);}return 0;
}

ExtractData.h

wav文件的文件头一般是44字节(除非fmt块后面有ExtraParamSize 和ExtraParams 项)。Header详细信息见上文链接。

  • uint8_t: unsigned char
  • uint16_t: unsigned short
  • uint32_t: unsigned int
#ifndef _EXTRACTDATA_H_
#define _EXTRACTDATA_H_#include <stdint.h>typedef struct tagWAVHEADER {uint8_t   ChunkID[4];     // 文档标识。       大写字符串"RIFF",标明该文件为有效的 RIFF 格式文档。uint32_t  ChunkSize;      // 文件数据长度。   从下一个字段首地址开始到文件末尾的总字节数。该字段的数值加 8 为当前文件的实际长度。uint8_t   Format[4];      // 文件格式类型。   所有 WAV 格式的文件此处为字符串"WAVE",标明该文件是 WAV 格式文件。uint8_t   FmtChunkID[4];  // 格式块标识。     小写字符串,"fmt "。uint32_t  FmtChunkSize;   // 格式块长度。     其数值不确定,取决于编码格式。可以是 16、 18 、20、40 等。uint16_t  AudioFormat;    // 编码格式代码。   常见的 WAV 文件使用 PCM 脉冲编码调制格式,该数值通常为 1。uint16_t  NumChannels;    // 声道个数。       单声道为 1,立体声或双声道为 2。uint32_t  SampleRate;     // 采样频率。       每个声道单位时间采样次数。常用的采样频率有 11025, 22050 和 44100 kHz。uint32_t  ByteRate;       // 数据传输速率。   该数值为:声道数×采样频率×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。uint16_t  BlockAlign;     // 数据块对齐单位。 采样帧大小。该数值为:声道数×位数/8。播放软件需要一次处理多个该值大小的字节数据,用该数值调整缓冲区。uint16_t  BitsPerSample;  // 采样位数。       存储每个采样值所用的二进制数位数。常见的位数有 4、8、12、16、24、32。uint8_t   DataChunkID[4];uint32_t  DataChunkSize;
} WAVHEADER;#endif  // #ifndef _EXTRACTDATA_H_

利用C语言读取WAV文件相关推荐

  1. c语言读文件编译,C语言读取wav文件的问题,请大侠,编译问题。

    已结贴√ 问题点数:20 回复次数:5 C语言读取wav文件的问题,请大侠,编译问题. 代码如下:#include #include LRESULT CALLBACK WndProc (HWND, U ...

  2. C语言读取wav文件

    参考代码: wav音频文件格式解析 代码的思路是编写wave.h,根据wav文件结构定义struct.大佬的执行结果为 然而我在运行代码的时候遇到的问题: 可以看到fmt长度为18,然而还是按照16来 ...

  3. 利用C语言读取BMP文件

    文章目录 什么是bmp文件 1.文件头信息块 2.图像描述信息块 3.颜色表 4.图像数据区 编写代码 C文件 h头文件 存储算法 什么是bmp文件 BMP是bitmap的缩写形式,bitmap顾名思 ...

  4. R语言读取csv文件,第一列列名出现乱码的解决方法

    在利用R语言读取csv文件时,第一列列名总是出现乱码,代码如下: setwd("E:\2.Model\4. Simulation") #设定文件路径 All.Soils = rea ...

  5. R语言读取csv文件,第一列列名出现乱码怎么办

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/weixin_45075290/art ...

  6. c语言格式化写入文件大小,利用C语言格式化读写文件

    "在C语言中进行格式化读写文件"按照字面意思通常大家都会理解为将读写文件进行格式化的操作,那么到底我们是不是真的将读写文件进行格式化的操作呢?下面课课家笔者就为大家简单介绍C语言中 ...

  7. C语言实现wav文件的读写

    C语言实现wav文件的读写 wav文件格式 //wav.h typedef unsigned char uint8_t; typedef signed char int8_t; typedef uns ...

  8. R语言读取excel文件实战(read.xlsx函数、read_excel函数、read.xlsx函数、Write函数)

    R语言读取excel文件实战(read.xlsx函数.read_excel函数.read.xlsx函数.Write函数) 目录 R语言读取excel文件实战(read.xlsx函数.read_exce ...

  9. json字段顺序读取 python_如何利用Python批量读取视频文件的时间长度?

    本期的主题是利用Python来实现对视频文件时间长度的读取. 在学习编程语言时,相比较于通过书本来学习知识,我更喜欢通过观看学习视频的方式来进行学习,通过主讲老师的讲解,我能很直观且快速的了解一些知识 ...

  10. matlab 读取WAV文件

    最近工作需要,要对wav文件中存储的声音信息进行分析处理.所以花了些时间收集了各种数学软件中处理wav 文件的方法. Matlab Matlab 是最方便的.甚至于不用写任何代码就能读取 wav 文件 ...

最新文章

  1. 解读2018年诺贝尔化学奖成果:用进化的力量解决化学问题
  2. 详解keepalived配置和使用
  3. centos6.5 install mongodb
  4. save_path is not a valid checkpoint
  5. JZOJ 5689. 【GDOI2018Day2模拟4.25】二进制
  6. 获取远程计算机动态ip,c# - 获取远程主机的IP地址
  7. 无穷大功率电源matlab仿真,MATLAB-Simulink系统建模与仿真-实验报告
  8. docker官方文档中的dns,link,expose,publish
  9. python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别
  10. MySQL入门 (一) : 资料库概论与MySQL的安装
  11. 提取lbp特征java代码_特征提取算法之LBP
  12. ubuntu 13.10 64位安装及配置 google拼音输入法及Adobe flash player、mp3 插件安装、中文GBK编码等 -转
  13. OpenCV实现车牌识别,OCR分割,ANN神经网络
  14. 吸烟者问题C++实现
  15. Unity3D 放大缩小图片
  16. 因子分析和主成分分析
  17. 高分辨率对地观测系统重大科技专项简介
  18. 开源之道解读 Liunx 基金会开源办公室调查报告
  19. Android面试题和答案
  20. Android常用开源库整理汇总

热门文章

  1. LAMP架构之4——MySQL源码编译及使用
  2. 使用webgl(three.js)搭建一个3D智慧园区、3D建筑,3D消防模拟,web版3D,bim管理系统——第四课(炫酷版一)...
  3. fragstats教程
  4. qq微信趣味测试小程序源码
  5. 注册公司选小规模还是一般人?四种判别方式讲得明明白白
  6. VGG16网络结构复现(Pytorch版)
  7. fh 幅频特性曲线怎么画fl_放大电路幅频特性曲线的测试方法.PPT
  8. 麦克风阵列技术 二 (自动增益控制 自动噪声抑制 回声消除 语音活动检测)
  9. Java实现短信验证码(阿里云)附短信SDK demo下载
  10. 四阶龙格库塔法c语言程序,四阶龙格库塔法C语言(西安交大)