C++读取WAV音频文件的头部数据的实现方法

C++读取WAV音频文件的头部数据的实现方法

前言:

在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正。写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长。

实现代码:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;
using std::string;
using std::fstream;

typedef struct WAV_HEADER{
  char        RIFF[4];    // RIFF Header   Magic header
  unsigned long    ChunkSize;   // RIFF Chunk Size
  char        WAVE[4];    // WAVE Header
  char        fmt[4];     // FMT header
  unsigned long    Subchunk1Size; // Size of the fmt chunk
  unsigned short   AudioFormat;  // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
  unsigned short   NumOfChan;   // Number of channels 1=Mono 2=Sterio
  unsigned long    SamplesPerSec; // Sampling Frequency in Hz
  unsigned long    bytesPerSec;  // bytes per second
  unsigned short   blockAlign;   // 2=16-bit mono, 4=16-bit stereo
  unsigned short   bitsPerSample; // Number of bits per sample
  char        Subchunk2ID[4]; // "data" string
  unsigned long    Subchunk2Size; // Sampled data length  

}wav_hdr; 

// Function prototypes
int getFileSize(FILE *inFile); 

int main(int argc,char *argv[]){
  wav_hdr wavHeader;
  FILE *wavFile;
  int headerSize = sizeof(wav_hdr),filelength = 0;

  string answer;

  do{
    string input;
    string answer;

    const char* filePath;

    cout << "Pick wav file from the Windows Media File: ";
    cin >> input;
    cin.get();

    cout << endl;

    path = "C:\\Windows\\Media\\" + input + ".wav";
    filePath = path.c_str();

    wavFile = fopen( filePath , "r" );

    if(wavFile == NULL){
      printf("Can not able to open wave file\n");
      //exit(EXIT_FAILURE);
    }

    fread(&wavHeader,headerSize,1,wavFile);
    filelength = getFileSize(wavFile);
    fclose(wavFile);

    cout << "File is          :" << filelength << " bytes." << endl;

    cout << "RIFF header        :" << wavHeader.RIFF[0]
                        << wavHeader.RIFF[1]
                        << wavHeader.RIFF[2]
                        << wavHeader.RIFF[3] << endl;

    cout << "WAVE header        :" << wavHeader.WAVE[0]
                        << wavHeader.WAVE[1]
                        << wavHeader.WAVE[2]
                        << wavHeader.WAVE[3]
                        << endl;

    cout << "FMT            :" << wavHeader.fmt[0]
                        << wavHeader.fmt[1]
                        << wavHeader.fmt[2]
                        << wavHeader.fmt[3]
                        << endl;

    cout << "Data size         :" << wavHeader.ChunkSize << endl;

    // Display the sampling Rate form the header
    cout << "Sampling Rate       :" << wavHeader.SamplesPerSec << endl;
    cout << "Number of bits used    :" << wavHeader.bitsPerSample << endl;
    cout << "Number of channels     :" << wavHeader.NumOfChan << endl;
    cout << "Number of bytes per second :" << wavHeader.bytesPerSec << endl;
    cout << "Data length        :" << wavHeader.Subchunk2Size << endl;
    cout << "Audio Format        :" << wavHeader.AudioFormat << endl;
    // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM 

    cout << "Block align        :" << wavHeader.blockAlign << endl;

    cout << "Data string        :" << wavHeader.Subchunk2ID[0]
                        << wavHeader.Subchunk2ID[1]
                        << wavHeader.Subchunk2ID[2]
                        << wavHeader.Subchunk2ID[3]
                        << endl;

    cout << endl << endl << "Try something else? (y/n)";
    cin >> answer;
    //cin.get();
    cout << endl << endl;

  }while( answer == "y" );

  getchar();
  return 0;
}
// find the file size
int getFileSize(FILE *inFile){
  int fileSize = 0;
  fseek(inFile,0,SEEK_END);

  fileSize=ftell(inFile);

  fseek(inFile,0,SEEK_SET);
  return fileSize;
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望通过本文能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++ 约瑟夫环的实例代码

    C++ 约瑟夫环的实例代码 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 分析:有n个人,要想所有的人都退出去,只有每个人喊到m,才可以退完,所以可以算出,n*m为所有人总共报数的总次数. 代码: /* * 约瑟夫出圈 */ #include <stdio.h> int main() { char peo[

  • C++ 中boost::share_ptr智能指针的使用方法

    C++ 中boost::share_ptr智能指针的使用方法 最近项目中使用boost库的智能指针,感觉智能指针还是蛮强大的,在此贴出自己学习过程中编写的测试代码,以供其他想了解boost智能指针的朋友参考,有讲得不正确之处欢迎指出讨论.当然,使用boost智能指针首先要编译boost库,具体方法可以网上查询,在此不再赘述. 智能指针能够使C++的开发简单化,主要是它能够自动管理内存的释放,而且能够做更多的事情,即使用智能指针,则可以再代码中new了之后不用delete,智能指针自己会帮助你管理

  • C++中构造函数的参数缺省的详解

    C++中构造函数的参数缺省的详解 前言: 构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值.在构造函数中也可以采用这样的方法来实现初始化. #include <iostream> using namespace std; class A { public : A(int aa=0,int bb=00); //在声明构造函数时指定默认参数 int volume( ); int a; int b; }; int main( ) { A

  • C++中new和delete的使用方法详解

    C++中new和delete的使用方法详解 new和delete运算符用于动态分配和撤销内存的运算符 new用法:           1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a. 2)int *a = new int(5) 作用同上,但是同时将整数赋值为5           2.     开辟数组空间 一维: int *a = new in

  • C++ 中构造函数的实例详解

    C++ 中构造函数的实例详解 c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助. 1. 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0; } private: // 数据成员 int m_va

  • C++读取WAV音频文件的头部数据的实现方法

    C++读取WAV音频文件的头部数据的实现方法 前言: 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 实现代码: #include <iostream> #include <string> #include <fstream> using namespace std; using std::string; using std::fstr

  • Python 读取WAV音频文件 画频谱的实例

    Python 读取WAV文件 import wave import struct from scipy import * from pylab import * #读取wav文件,我这儿读了个自己用python写的音阶的wav filename = '1.wav' wavefile = wave.open(filename, 'r') # open for writing #读取wav文件的四种信息的函数.期中numframes表示一共读取了几个frames,在后面要用到滴. nchannels

  • java实现切割wav音频文件的方法详解【附外部jar包下载】

    本文实例讲述了java实现切割wav音频文件的方法.分享给大家供大家参考,具体如下: import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.MultimediaInfo; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import j

  • Python3.7 读取 mp3 音频文件生成波形图效果

    测试环境为Windows 10 系统,Python3.7,转换需要提前安装pydub.ffmpeg,安装和加入环境变量配置方法自行解决,至于缺少的包直接 pip install xx 搞定. 主要是 mp3 转成 wav 格式的文件,因为 mp3 格式为了减小体积牺牲了音质,转成无损的 wav 格式之后,可以读取到更详细的信息.然后读取 wav 的信息,利用 matlotlib 绘图即可. mp3towavaform.py 代码: #coding=utf8 from pydub import A

  • C# 基于NAudio实现对Wav音频文件剪切(限PCM格式)

    目录 前言 实现代码 效果图 前言 C#基于NAudio工具对Wav音频文件进行剪切,将一个音频文件剪切成多个音频文件 注:调用方法前需要导入NAudio.dll或者在NuGet程序管理器搜索NAudio并安装 本文是按时间剪切 实现代码 using NAudio.Wave; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Ta

  • PowerShell中实现播放WAV音频文件

    适用于所有PowerShell版本 其实在PowerShell中播放WAV文件非常简单: 复制代码 代码如下: # 在Windows 目录找到一个可用的WAV音频文件 $WAVPath = Get-ChildItem -Path $env:windir -Filter *.wav -Recurse -ErrorAction SilentlyContinue |  Select-Object -First 1 -ExpandProperty FullName    # 加载并播放 "Playing

  • python3 写一个WAV音频文件播放器的代码

    环境:ubuntu 16.04 python3.5 pycharm 包 : wave pyaudio sys 上代码:AudioPlayer.py # coding:utf-8 # author:king # brief : 播放wav音频文件 import wave from pyaudio import PyAudio import sys def player(filename): chunk = 1024 wf = wave.open(filename, 'rb') p = PyAudi

  • Nodejs读取本地json文件,输出json数据接口方式

    目录 Nodejs读取本地json文件,输出json数据接口 第一步:准备本地JSON文件 第二步:编写nodejs服务程序 第三步: 测试请求接口数据 nodejs读取本地json文件中文乱码 第一种方式 第二种方式 Nodejs读取本地json文件,输出json数据接口 第一步:准备本地JSON文件 F:\nodejs\data\test.json {     "code": 0,     "msg": "请求成功",     "d

  • 解析WPF实现音频文件循环顺序播放的解决方法

    要做基于WPF的音频文件循环顺序播放首先要了解WPF下有哪些类是用于控制音频的. WPF下主要有两个音频控制的类,这里做下比较: 1.SoundPlayer 2.MediaPlayer 派生MediaElement 一.SoundPlayer类   1.基于.NET FRAMEWORK 2.0: 2.可播放WAV音频文件: 3.只能播放一个文件,同时播放多个文件会后一个文件的播放操作会终止前一个播放的文件: 4.不能对音量进行控制:二.MediaPlayer类 1.基于WPF: 2.支持多种音频

  • 从C语言中读取Python 类文件对象

    问题 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件.StringIO对象等). 解决方案 要读取一个类文件对象的数据,你需要重复调用 read() 方法,然后正确的解码获得的数据. 下面是一个C扩展函数例子,仅仅只是读取一个类文件对象中的所有数据并将其输出到标准输出: #define CHUNK_SIZE 8192 /* Consume a "file-like" object and write bytes to stdout */ static PyObj

随机推荐