解析WAV音频文件----》生成WAV音频文件头
前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i
WAV音频文件介绍:
WAV文件是在PC机平台上很常见的、最经典的多媒体音频文件,最早于1991年8月出现在Windows3.1操作系统上,文件扩展名为WAV,是WaveForm的简写,也称为波形文件,可直接存储声音波形,还原的波形曲线十分逼真。WAV文件格式简称WAV格式是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,WAV文件还原而成的声音的音质取决于声音卡采样样本的尺寸,采样频率越高,音质就越好,但开销就越大,WAV文件也就越大。
对WAV音频文件截取说明:
WAV文件不像MP3格式音频文件,对一段完整的MP3格式音频做任意截取是完全OK的,音频文件依然可以播放,因为MP3音频格式文件每一部分截取它都带有音频头文件信息,但对一段完整的WAV音频文件做部分截取,截取出来的音频文件是无法播放的,除非截取的是从第一位开始截取,截取的数据已经包含的头文件,否则文件无法解析播放。
生成WAV头部文件需要四个参数(附代码说明):
一、声道数、
二、采样率、
三、采样精度
四、音频数据总长度、
/**
* @param totalAudioLen 不包括header的音频数据总长度
* @param longSampleRate 采样率,也就是录制时使用的频率、音频采样级别 8000 = 8KHz
* @param channels audioRecord的声道数1/2
* @param audioFormat 采样精度; 譬如 16bit
* @throws IOException 写文件错误
*/
private static byte[] writeWavFileHeader(long totalAudioLen, long longSampleRate,
int channels, int audioFormat) throws IOException {
byte[] header = generateWavFileHeader(totalAudioLen, longSampleRate, channels,audioFormat);
return header;
} /**
* @param totalAudioLen 不包括header的音频数据总长度
* @param longSampleRate 采样率,也就是录制时使用的频率
* @param channels audioRecord的频道数量
* @param audioFormat 采样精度; 譬如 16bit
*/
private static byte[] generateWavFileHeader(long totalAudioLen, long longSampleRate, int channels,int audioFormat) {
long totalDataLen = totalAudioLen + 36;
long byteRate = longSampleRate * 2 * channels;
byte[] header = new byte[44];
header[0] = 'R'; // RIFF
header[1] = 'I';
header[2] = 'F';
header[3] = 'F';
//文件长度 4字节文件长度,这个长度不包括"RIFF"标志(4字节)和文件长度本身所占字节(4字节),即该长度等于整个文件长度 - 8
header[4] = (byte) (totalDataLen & 0xff);
header[5] = (byte) ((totalDataLen >> 8) & 0xff);
header[6] = (byte) ((totalDataLen >> 16) & 0xff);
header[7] = (byte) ((totalDataLen >> 24) & 0xff);
//fcc type:4字节 "WAVE" 类型块标识, 大写
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
//FMT Chunk 4字节 表示"fmt" chunk的开始,此块中包括文件内部格式信息,小写, 最后一个字符是空格
header[12] = 'f'; // 'fmt '
header[13] = 'm';
header[14] = 't';
header[15] = ' ';//过渡字节
//数据大小 4字节,文件内部格式信息数据的大小,过滤字节(一般为00000010H)
header[16] = 16;
header[17] = 0;
header[18] = 0;
header[19] = 0;
//编码方式 10H为PCM编码格式 FormatTag:2字节,音频数据的编码方式,1:表示是PCM 编码
header[20] = 1; // format = 1
header[21] = 0;
//通道数 Channels:2字节,声道数,单声道为1,双声道为2
header[22] = (byte) channels;
header[23] = 0;
//采样率,每个通道的播放速度
header[24] = (byte) (longSampleRate & 0xff);
header[25] = (byte) ((longSampleRate >> 8) & 0xff);
header[26] = (byte) ((longSampleRate >> 16) & 0xff);
header[27] = (byte) ((longSampleRate >> 24) & 0xff);
//音频数据传送速率,采样率*通道数*采样深度/8
//4字节,音频数据传送速率, 单位是字节。其值为采样率×每次采样大小。播放软件利用此值可以估计缓冲区的大小
//byteRate = sampleRate * (bitsPerSample / 8) * channels
header[28] = (byte) (byteRate & 0xff);
header[29] = (byte) ((byteRate >> 8) & 0xff);
header[30] = (byte) ((byteRate >> 16) & 0xff);
header[31] = (byte) ((byteRate >> 24) & 0xff);
// 确定系统一次要处理多少个这样字节的数据,确定缓冲区,通道数*采样位数
header[32] = (byte) (2 * channels);
header[33] = 0;
//每个样本的数据位数
//2字节,每个声道的采样精度; 譬如 16bit 在这里的值就是16。如果有多个声道,则每个声道的采样精度大小都一样的;
header[34] = (byte) audioFormat;
header[35] = 0;
//Data chunk
//ckid:4字节,数据标志符(data),表示 "data" chunk的开始。此块中包含音频数据,小写;
header[36] = 'd';
header[37] = 'a';
header[38] = 't';
header[39] = 'a';
//音频数据的长度,4字节,audioDataLen = totalDataLen - 36 = fileLenIncludeHeader - 44
header[40] = (byte) (totalAudioLen & 0xff);
header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
return header;
}
本人亲测!!!完成以上代码即可生成WAV音频头文件,即可把头文件和截取的部分WAV音频数据进行字节数组合并,音频文件正常播放!
参考文章一、参考文章二
个人总结:
我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!
解析WAV音频文件----》生成WAV音频文件头的更多相关文章
- 获取google翻译的音频文件_合并音频文件的方法
1. 把引文输入google 翻译,然后点击"朗读"
- Java中解析wav音频文件信息:音频声道数,采样频率,采样位数、声音尺寸
前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 音频解析方法: public static int toInt(byte[] b) { return ((b[3] << 2 ...
- 解析Markdown文件生成React组件文档
前言 最近做的项目使用了微前端框架single-spa. 对于这类微前端框架而言,通常有个utility应用,也就是公共应用,里面是各个子应用之间可以共用的一些公共组件或者方法. 对于一个团队而言,项 ...
- C# NAudio录音和播放音频文件-实时绘制音频波形图(从音频流数据获取,而非设备获取)
NAudio的录音和播放录音都有对应的类,我在使用Wav格式进行录音和播放录音时使用的类时WaveIn和WaveOut,这两个类是对功能的回调和一些事件触发. 在WaveIn和WaveOut之外还有对 ...
- node 加密音频文件 和 解密音频文件
fs.readFile('./downsuccess/'+name+'', {flag: 'r+', encoding: ''}, function (err, data) { c ...
- 设置Pycharm在创建py文件时自动添加文件头注释(类似于钩子特性)
在每次新建一个py文件的时候 1 如何自动添加 #!/usr/bin/env python2 自动添加 #-*- coding: utf-8 -*- 操作方法: File -> se ...
- 读写UTF-8、Unicode文件(加上了文件头,貌似挺好用)
conf配置文件一些为UTF-8和Unicode格式,这样便可良好的支持多语言,从网上查阅资料后,将读写UTF-8.Unicode文件写了几个最精简的函数,更新后加了是否写文件头的功能,以适应更多需要 ...
- Pycharm在创建py文件时,自动添加文件头注释
依次File -> Settings -> Editor -> File and Code Templates -> Python Script 添加以下代码: # -*- ...
- Qt ------ WAV 音频文件播放
1.用 QFile 打开 WAV 文件,读出文件头信息,看看是否符合音频播放设备的要求 QAudioDeviceInfo m_audioOutputDevice;//可以获取音频输出设备的信息,比如哪 ...
- C语言解析WAV音频文件
C语言解析WAV音频文件 代码地址: Github : https://github.com/CasterWx/c-wave-master 目录 前言 了解WAV音频文件 什么是二进制文件 WAV的二 ...
随机推荐
- PHP cosh() 函数
实例 返回不同数的双曲余弦: <?phpecho(cosh(3) . "<br>");echo(cosh(-3) . "<br>" ...
- bzoj 3782 上学路线 卢卡斯定理 容斥 中国剩余定理 dp
LINK:上学路线 从(0,0)走到(n,m)每次只能向上或者向右走 有K个点不能走求方案数,对P取模. \(1\leq N,M\leq 10^10 0\leq T\leq 200\) p=10000 ...
- HDFS---NameNode管理元数据及HA模式
NameNode主要保存了下面的内容 1-维护元数据信息.Block和文件之间的关系,即某一个特定文件都有哪些Block: 2-每一个Block存储在什么位置(DataNode上面): 3-维护HDF ...
- 关于saltstack的job问题
问题背景:搭建一个多节点后端集群,使用saltstack作为底层管理,使用Python封装saltstack接口成逻辑层.通过逻辑层的调用实现对整个集群的运维管理. 问题:随着项目中模块的增多,发现s ...
- javascript Math对象 、Date对象笔记
Math对象 Math 是一个内置对象, 它具有数学常数和函数的属性和方法.不是一个函数对象. Math数学对象不是构造函数使用的时候不需要new来调用,可以直接使用里面的属性和方法 ...
- C/C++陷阱与套路,当年就是折在这些地儿…
摘要:本文结合作者的工作经验和学习心得,对C++语言的一些高级特性,做了简单介绍:对一些常见的误解,做了解释澄清:对比较容易犯错的地方,做了归纳总结:希望借此能增进大家对C++语言了解,减少编程出错, ...
- data argumentation 数据增强汇总
几何变换 flip:水平翻转,也叫镜像:垂直翻转 rotation:图片旋转一定的角度,这个可以通过opencv来操作,各个框架也有自己的算子 crop:随机裁剪,比如说,在ImageNet中可以将输 ...
- XCTF-WEB-新手练习区(9-12)笔记
9:xff_referer X老师告诉小宁其实xff和referer是可以伪造的. 界面显示需要我们 添加X-Forwarded-For:123.123.123.123 添加Rerferer:http ...
- P、NP、NPC问题详解
转载地址 https://blog.csdn.net/bcb5202/article/details/51202589 P.NP.NPC 概念 > P问题:能够在多项式时间内解决的决策问题. - ...
- 基于.NetCore3.1系列 —— 日志记录之自定义日志组件
一.前言 回顾:日志记录之日志核心要素揭秘 在上一篇中,我们通过学习了解在.net core 中内置的日志记录中的几大核心要素,在日志工厂记录器(ILoggerFactory)中实现将日志记录提供器( ...