解析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 current() 函数
实例 输出数组中的当前元素的值: <?php$people = array("Peter", "Joe", "Glenn", &quo ...
- C/C++编程笔记:C语言NULL值和数字 0 值区别及NULL详解
在学习C语言的时候,我们常常会碰到C语言NULL值和数字 0 ,很多小伙伴搞不清楚他们之间的一个区别,今天我们就了解一下他们之间的区别,一起来看看吧! 先看下面一段代码输出什么: 输出<null ...
- 2019 HL SC day10
10天都过去了 4天都在全程懵逼.. 怎么可以这么难啊 我服了 现在想起依稀只记得一些结论 什么 反演? 什么后缀自动机?什么组合数的应用?什么神仙东西 ,不过讲课人的确都是神仙.(实名羡慕. mzx ...
- 剑指 Offer 50. 第一个只出现一次的字符
本题 题目链接 题目描述 我的题解 (方法三应用更广泛:方法一虽有限制,但很好用,此题中该方法效率也最高) 方法一:(适用于范围确定的) 思路分析 该字符串只包含小写字母,即字符种类最多26个 开一个 ...
- mnist手写数字识别——深度学习入门项目(tensorflow+keras+Sequential模型)
前言 今天记录一下深度学习的另外一个入门项目——<mnist数据集手写数字识别>,这是一个入门必备的学习案例,主要使用了tensorflow下的keras网络结构的Sequential模型 ...
- .net core MongoDB 初试
是这样的,我们有一个场景,另一个服务器是写到MongoDB里面,我们的MVC页面要展示,需要分页展示 自己写了一个DAL public class MongoConnect { public stri ...
- js数组中如何去除重复值?
在日常开发中,我们可能会遇到将一个数组中里面的重复值去除,那么,我就将我自己所学习到的几种方法分享出来 去除数组重复值方法: 1,利用indexOf()方法去除 思路:创建一个新数组,然后循环要去重的 ...
- 秦九韶算法 & 三分法
前言 今天考试出了一个题 郭郭模拟退火骗了75分 于是再次把咕咕了好久的模退提上日程 如果进展顺利 明后天应该会开爬山算法和模退的博客笔记 今天先把今天考试的正解学习一下--三分法 引入 老规矩上板子 ...
- Unity 笔记
摄像机 Main Camera 跟随主角移动,不看 UI 剧情摄像机 当进入剧情时,可以关闭 main camera,启用剧情摄像机,不看 UI UI 摄像机 看 UI Unity编辑器常用的sett ...
- GitLab 转让所有者权限
GitLab 转让所有者权限 没有查看文档,自己测试了一下,可能会有纰漏,谨慎阅读 私人项目的所有者 私人项目没有所有者权限,可以认为项目命名空间就是所有者. 私人项目http://xxxxxxxxx ...