本文实例讲述了java读取wav文件(波形文件)并绘制波形图的方法。分享给大家供大家参考。具体如下:

因为最近有不少网友询问我波形文件读写方面的问题,出于让大家更方便以及让代码能够得到更好的改进,我将这部分(波形文件的读写)代码开源在github上面。

地址为https://github.com/sintrb/WaveAccess/,最新的代码、例子、文档都在那上面,我会在我时间精力允许的前提下对该项目进行维护,同http://www.cppcns.com时也希望对这方面有兴趣的网友能够加入到该开源项目上。

以下内容基本都过期了,你可以直接去GitHub上面阅读、下载该项目。

因项目需要读取.wav文件(波形文件)并绘制波形图,因此简单的做了这方面的封装。

其实主要是对wav文件读取的封装,下面是一个wav文件读取器的封装:

// filename: WaveFileReader.java

// RobinTang

// 2012-08-23

import java.io.*;

public class WaveFileReader {

private String filename = null;

private int[][] data = null;

private int len = 0;

private String chunkdescriptor = null;

static private int lenchunkdescriptor = 4;

private long chunksize = 0;

static private int lenchunksize = 4;

private String waveflag = null;

static private int lenwaveflag = 4;

private String fmtubchunk = null;

static private int lenfmtubchunk = 4;

private long subchunk1size = 0;

static private int lensubchunk1size = 4;

private int audioformat = 0;

static private int lenaudioformat = 2;

private int numchannels = 0;

static private int lennumchannels = 2;

private long samplerate = 0;

static private int lensamplerate = 2;

private long byterate = 0;

static private int lenbyterate = 4;

private int blockalign = 0;

static private int lenblockling = 2;

private int bitspersample = 0;

static private int lenbitspersample = 2;

private String datasubchunk = null;

static private int lendatasubchunk = 4;

private long subchunk2size = 0;

static private int lensubchunk2size = 4;

private FileInputStream fis = null;

private BufferedInputStream bis = null;

private boolean issuccess = false;

public WaveFileReader(String filename) {

this.initReader(filename);

}

// 判断是否创建wav读取器成功

public boolean isSuccess() {

return issuccess;

}

// 获取每个采样的编码长度,8bit或者16bit

public int getBitPerSample(){

return this.bitspersample;

}

// 获取采样率

public long getSampleRate(){

return this.samplerate;

}

// 获取声道个数,1代表单声道 2代表立体声

public int getNumChannels(){

return this.numchannels;

}

// 获取数据长度,也就是一共采样多少个

public int getDataLen(){

return this.len;

}

// 获取数据

// 数据是一个二维数组,[n][m]代表第n个声道的第m个采样值

public int[][] getData(){

return this.data;

}

private void initReader(String filename){

this.filename = filename;

try {

fis = new FileInputStream(this.filename);

bis = new BufferedInputStream(fis);

this.chunkdescriptor = readString(lenchunkdescriptor);

if(!chunkdescriptor.endsWith("RIFF"))

throw new IllegalArgumentException("RIFF miss, " + filename + " is not a wave file.");

this.chunksize = readLong();

this.waveflag = readString(lenwaveflag);

if(!waveflag.endsWith("WAVE"))

throw new IllegalArgumentException("WAVE miss, " + filename + " is not a wave file.");

this.fmtubchunk = readString(lenfmtubchunk);

if(!fmtubchunk.endsWith("fmt "))

throw new IllegalArgumentException("fmt miss, " + filename + " is not a wave file.");

thhttp://www.cppcns.comxception("no more data!!!");

res = (buf[0]&0x000000FF) | (((int)buf[1])<<8);

} catch (IOException e) {

e.printStackTrace();

}

return res;

}

private long readLong(){

long res = 0;

try {

long[] l = new long[4];

for(int i=0; i<4; ++i){

l[i] = bis.read();

if(l[i]==-1){

throw new IOException("no more data!!!");

}

}

res = l[0] | (l[1]<<8) | (l[2]<<16) | (l[3]<<24);

} catch (IOException e) {

e.printStackTrace();

}

return res;

}

private byte[] readBytes(int len){

byte[] buf = new byte[len];

try {

if(bis.read(buf)!=len)

throw new IOException("no more data!

为了绘制波形,因此做了一个从JPanel教程而来的波形绘制面板:

// filename: DrawPanel.java

// RobinTang

// 2012-08-23

import java.awt.Color;

import java.awt.Graphics;

import javax.swing.JPanel;

@SuppressWarnings("serial")

public class DrawPanel extends JPanel {

private int[] data = null;

public DrawPanel(int[] data) {

this.data = data;

}

@Override

protected void paintComponent(Graphics g) {

int ww = getWidth();

int hh = getHeight();

g.setColor(Color.WHITE);

g.fillRect(0, 0, ww, hh);

int len = data.length;

int step = len/ww;

if(step==0)

step = 1;

int prex = 0, prey = 0; //上一个坐标

int x = 0, y = 0;

g.setColor(Color.RED);

double k = hh/2.0/32768.0;

for(int i=0; i

x = i;

// 下面是个

有了这些之后就可以调用绘制了,简单的:

// WaveFileReadDemo.java

// RobinTang

// 2012-08-23

import javax.swing.JFrame;

public class WaveFileReadDemo {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

String filename = "file.wav";

JFrame frame = new JFrame();

WaveFileReader reader = new WaveFileReader(filename);

if(reader.isSuccess()){

int[] data = reader.getData()[0]; //获取第一声道

DrawPanel drawPanel = new DrawPanel(data); // 创建一个绘制波形的面板

frame.add(drawPanel);

frame.setTitle(filename);

frame.setSize(800, 400);

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

else{

System.err.println(filename + "不是一个正常的wav文件");

}

}

}

工程的源代码可以在我的百度网盘上找到,直接到开源JAVA

放上效果图一张:

希望本文所述对大家的java程序设计有所帮助。

本文标题: java读取wav文件(波形文件)并绘制波形图的方法

本文地址: http://www.cppcns.com/ruanjian/java/127069.html

java 音频波形图_java读取wav文件(波形文件)并绘制波形图的方法相关推荐

  1. java wav 波形_java读取wav文件(波形文件)并绘制波形图的方法

    本文实例讲述了java读取wav文件(波形文件)并绘制波形图的方法.分享给大家供大家参考.具体如下: 因为最近有不少网友询问我波形文件读写方面的问题,出于让大家更方便以及让代码能够得到更好的改进,我将 ...

  2. java wav 读取_java读取wav文件(波形文件)并绘制波形图的方法

    本文实例讲述了java读取wav文件(波形文件)并绘制波形图的方法.分享给大家供大家参考.具体如下: 因为最近有不少网友询问我波形文件读写方面的问题,出于让大家更方便以及让代码能够得到更好的改进,我将 ...

  3. java xml 反射_Java 读取XML文件以及Java 的反射机制实现

    Java 读取XML文件以及Java 的反射机制实现 代码部分 import java.io.File; import javax.xml.parsers.DocumentBuilder; impor ...

  4. java classpath 遍历_Java 读取JAR文件信息

    Java 读取JAR文件信息 为什么想到读取JAR文件的信息 查看spring 资源处理,查找多个资源classpath*,会去寻找jar包中的内容,因此会出现读取jar包中的文件或者读取文件夹中的文 ...

  5. java获取音乐_Java读取MP3文件的信息(歌曲名,歌手...)

    还记得之前写一款Android播放软件时,为了让APP获得MP3音乐文件的相关信息,上网找了很多Java库.搞的APP满身赘肉.后来我研究了一下MP3文件的结构后发现,获取MP3文件信息根本不需要什么 ...

  6. java read出错_java读取txt文件时,错误的把txt内容读取了两遍

    package标准化模拟考试;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;importjav ...

  7. 睡眠音频分割及识别问题(十)--Java读取wav文件

    简介 Waveform Audio File Format(WAVE,又或者是因为扩展名而被大众所知的 wav),是微软与 IBM公司所开发在个人电脑存储音频流的编码格式. 由于项目需要从 wav 文 ...

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

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

  9. python音频频谱_Python读取WAV音频文件 画频谱的方法

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

  10. matlab 读取WAV文件

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

最新文章

  1. mysql reflush pri_mysql忘记root密码拯救方法(flush privileges)
  2. PyTorch 重磅更新,不只是支持 Windows
  3. SAP RETAIL 寄售模式公司间STO流程里收货过账不能基于外向交货单?
  4. 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测
  5. 漫画:什么是JVM的垃圾回收?
  6. jQuery得事件绑定
  7. python爬虫从入门到放弃-python爬虫从入门到放弃(八)之 Selenium库的使用
  8. [转载] python中sort()与sorted()
  9. 如何完成知识问答环节中的前期设置,题目准备及现场操作等主要流程?
  10. 计算机组成原理 - 基本概念
  11. 腾讯在线QQ代码和实现原理
  12. 大学生端午节网页作业制作 学生端午节日网页设计模板 传统文化节日端午节静态网页成品代码下载 端午节日网页设计作品
  13. NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE-论文翻译
  14. Python 计时器(秒钟、秒表)
  15. 索引合并和组合索引的比较
  16. 人力资源战略规划新思考
  17. 介绍Jackson JsonNode和ObjectNode(*)
  18. 神州泰岳:2018年度业绩快报
  19. 华为路由器负载均衡_华为路由器双出口负载均衡+备份(示例代码)
  20. 奔驰c语言控制系统使用方法,奔驰C200L灯光使用方法,C200L灯光开关图解说明

热门文章

  1. 找不到硬盘分区怎么办
  2. dtu连接mysql_Azure SQL的DTU和eDTU到底是个什么鬼
  3. 新版火狐浏览器安装Flash组件,解决部分网站视频无法观看问题
  4. WORD文档插入页码时有几页不显示不显示页码?怎么解决
  5. 【HTML 教程系列第 10 篇】什么是 HTML 中的水平线标签 hr
  6. 使用GoldWave制作“淡入/淡出”效果
  7. 你为什么那么努力还是不开心!
  8. 练习 P1957 口算练习题
  9. 中国医疗废物处理行业竞争格局与发展决策建议报告2022-2027年
  10. 【python学习笔记】Python的六种内置对象