(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/79498075冷血之心的博客)

wav音频文件是一种无损的音频文件,相对于MP3来说音质较好,当然文件大小也很大。

A WAVE file is often just a RIFF file with a single “WAVE” chunk which consists of two sub-chunks – a “fmt ” chunk specifying the data format and a “data” chunk containing the actual sample data. Call this form the “Canonical form”

其文件的内部格式如下:

用表格统计各个部分的含义如下:

一个简单的示例如下所示:

获取内部结构

那么我们如何使用Java程序来获取wav文件的内部结构信息呢?使用RandomAccessFile实现,代码如下所示:

package cn.pak1;import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;public class My {public static void main(String[] args) throws IOException {File f = new File("C://Users//yangwenqiang//Desktop//auoy.wav");RandomAccessFile rdf = null;rdf = new RandomAccessFile(f, "r");System.out.println("audio size: " + toInt(read(rdf, 4, 4))); // 音频文件大小System.out.println("audio format: " + toShort(read(rdf, 20, 2))); // 音频格式,1-PCMSystem.out.println("num channels: " + toShort(read(rdf, 22, 2))); // 1-单声道;2-双声道System.out.println("sample rate: " + toInt(read(rdf, 24, 4))); // 采样率、音频采样级别System.out.println("byte rate: " + toInt(read(rdf, 28, 4))); // 每秒波形的数据量System.out.println("block align: " + toShort(read(rdf, 32, 2))); // 采样帧的大小System.out.println("bits per sample: " + toShort(read(rdf, 34, 2))); // 采样位数rdf.close();}public static int toInt(byte[] b) {return ((b[3] << 24) + (b[2] << 16) + (b[1] << 8) + (b[0] << 0));}public static short toShort(byte[] b) {return (short) ((b[1] << 8) + (b[0] << 0));}public static byte[] read(RandomAccessFile rdf, int pos, int length) throws IOException {rdf.seek(pos);byte result[] = new byte[length];for (int i = 0; i < length; i++) {result[i] = rdf.readByte();}return result;}
}

结果如下所示:

我们分别得出该音频文件的大小、format、通道数量、采样率、字节率等消息。

RandomAccessFile的构造函数除了指定了要写入了文件,还有另外一个参数:mod,主要用来指定打开文件的访问模式。

使用了 RandomAccessFile,我们通过seek方法设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取操作,得到了音频文件的内部结构。

修改内部结构

修改内部结构,我们需要将RandomAccessFile的构造函数模式设为“rw”,并且write方法实现修改音频文件内部结构,代码如下所示:

package cn.pak1;import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;public class My {public static void main(String[] args) throws IOException {File f = new File("C://Users//yangwenqiang//Desktop//auoy.wav");RandomAccessFile rdf = null;rdf = new RandomAccessFile(f, "rw");write(rdf, 22);System.out.println("audio size: " + toInt(read(rdf, 4, 4))); // 音频文件大小System.out.println("audio format: " + toShort(read(rdf, 20, 2))); // 音频格式,1-PCMSystem.out.println("num channels: " + toShort(read(rdf, 22, 2))); // 1-单声道;2-双声道System.out.println("sample rate: " + toInt(read(rdf, 24, 4))); // 采样率、音频采样级别System.out.println("byte rate: " + toInt(read(rdf, 28, 4))); // 每秒波形的数据量System.out.println("block align: " + toShort(read(rdf, 32, 2))); // 采样帧的大小System.out.println("bits per sample: " + toShort(read(rdf, 34, 2))); // 采样位数rdf.close();}public static int toInt(byte[] b) {return ((b[3] << 24) + (b[2] << 16) + (b[1] << 8) + (b[0] << 0));}public static short toShort(byte[] b) {return (short) ((b[1] << 8) + (b[0] << 0));}public static byte[] read(RandomAccessFile rdf, int pos, int length) throws IOException {rdf.seek(pos);byte result[] = new byte[length];for (int i = 0; i < length; i++) {result[i] = rdf.readByte();}return result;}public static void write(RandomAccessFile rdf, int pos) throws IOException {rdf.seek(pos);byte[] b = {02,00};rdf.write(b);}
}

结果如下所示:

我们通过代码,就将通道数修改为2。实现其内部结构的修改。

以上就是如何使用Java代码获取和修改wav音频文件内部结构的小Demo。如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258(请备注来源)一起交流学习哦~

本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。

Java程序获取和修改.wav音频文件的内部结构相关推荐

  1. java切割wav音频文件

    import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.MultimediaInfo; import java.io. ...

  2. java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】

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

  3. java wav音频文件播放器demo

    java 简易wav音频文件播放器 测试文件 源码 相关资料 测试文件 csdn下载 : https://download.csdn.net/download/qq_41054313/18704149 ...

  4. Java 采集声音_通过java采集PC麦克风音频及播放wav音频文件

    AudioFormat对象 sampleRate 采样率 每秒音频采样数量 sampleSizeInBits 采样位数 每个采样的位数 channels 声道 1: Mono 单声道,2:Stereo ...

  5. Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件

    第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Begi ...

  6. c语言 文件 long double 读取,读取*.wav音频文件

    1.wav音频文件的格式 wav文件由文件头和采样数据2部分组成. 文件头又分为RIFF(Resource Interchange File Format).WAVE文件标识段 和 声音数据格式说明段 ...

  7. JAVA程序获取Tomcat的运行状态

    2019独角兽企业重金招聘Python工程师标准>>> 用浏览器来查看Tomcat的运行状态: 配置Tomcat的管理用户和权限. 打开%Tomcat_Home%/conf/目录下的 ...

  8. python音频频谱_Python 读取WAV音频文件 画频谱的实例

    Python 读取WAV文件 import wave import struct from scipy import * from pylab import * #读取wav文件,我这儿读了个自己用p ...

  9. 读取*.wav音频文件

    1.wav音频文件的格式 wav文件由文件头和采样数据2部分组成. 文件头又分为RIFF(Resource Interchange File Format).WAVE文件标识段 和 声音数据格式说明段 ...

最新文章

  1. ejabberd mysql 搭建配置_ejabberd安装步骤+Mysql配置
  2. OFDM专题之输入的复信号从何而来?
  3. Git 下载很慢问题解决方案
  4. leetcode28. 实现strStr()
  5. tensorflow一元二次函数拟合
  6. python网络编程项目_Python网络编程攻略
  7. Ubuntu18.04LTS搭建nodejs环境和webStorm
  8. Axios 请求配置参数详解
  9. 数据库的锁有哪几种?语句怎么实现
  10. 2022 IDLE 配置
  11. JRE和JDK的区别(笔记)
  12. python的内置函数功能[翻译]
  13. stata 求输出相关系数矩阵命令_Stata|①Get a foot in the door
  14. linux离线语音识别程序,linux离线语音识别安装运行总结
  15. bzoj3990【SDOI2015】排序
  16. 利用Java Swing技术设计一个Email邮箱地址注册的图形用户界面应用程序
  17. 可燃气体泄漏监控报警系统_独立式可燃气体泄漏探测报警系统软件整体解决方案
  18. jmeter文件上传压测file upload-数据为空-Connection terminated parsing multipart data
  19. BATJ都爱问的Java多线程面试题整理
  20. 13个人中找出叛徒的问题(耶稣问题)经典做法

热门文章

  1. ADB interface 驱动下载,以及使用,Because an app is obscuring a permission request settings can’t verify your
  2. 解决fullpage尾屏半屏问题
  3. 介绍一下我大二开发的游戏:地下城冒险
  4. 【Excel】选择性粘贴
  5. Quantopian 入门系列一
  6. ImageMagick将图片转为渐进式jpeg(progressive jpeg)
  7. mysql 字符串截取,拼接
  8. idea打开命令行窗口
  9. python歌词特效,根据歌词的进度在图片上显示歌词
  10. MNI模板和Talairach模板的区别