亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java讀取wav文件(波形文件)并繪制波形圖的方法

2019-11-26 15:07:51
字體:
來源:轉載
供稿:網友

本文實例講述了java讀取wav文件(波形文件)并繪制波形圖的方法。分享給大家供大家參考。具體如下:

因為最近有不少網友詢問我波形文件讀寫方面的問題,出于讓大家更方便以及讓代碼能夠得到更好的改進,我將這部分(波形文件的讀寫)代碼開源在GitHub上面。

地址為https://github.com/sintrb/WaveAccess/,最新的代碼、例子、文檔都在那上面,我會在我時間精力允許的前提下對該項目進行維護,同時也希望對這方面有興趣的網友能夠加入到該開源項目上。

以下內容基本都過期了,你可以直接去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.");       this.subchunk1size = readLong();       this.audioformat = readInt();       this.numchannels = readInt();       this.samplerate = readLong();       this.byterate = readLong();       this.blockalign = readInt();       this.bitspersample = readInt();       this.datasubchunk = readString(lendatasubchunk);       if(!datasubchunk.endsWith("data"))         throw new IllegalArgumentException("data miss, " + filename + " is not a wave file.");       this.subchunk2size = readLong();       this.len = (int)(this.subchunk2size/(this.bitspersample/8)/this.numchannels);       this.data = new int[this.numchannels][this.len];              for(int i=0; i<this.len; ++i){         for(int n=0; n<this.numchannels; ++n){           if(this.bitspersample == 8){             this.data[n][i] = bis.read();           }           else if(this.bitspersample == 16){             this.data[n][i] = this.readInt();           }         }       }       issuccess = true;     } catch (Exception e) {       e.printStackTrace();     }     finally{       try{       if(bis != null)         bis.close();       if(fis != null)         fis.close();       }       catch(Exception e1){         e1.printStackTrace();       }     }   }   private String readString(int len){     byte[] buf = new byte[len];     try {       if(bis.read(buf)!=len)         throw new IOException("no more data!!!");     } catch (IOException e) {       e.printStackTrace();     }     return new String(buf);   }   private int readInt(){     byte[] buf = new byte[2];     int res = 0;     try {       if(bis.read(buf)!=2)         throw new IOException("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!!!");     } catch (IOException e) {       e.printStackTrace();     }     return buf;   } } 

為了繪制波形,因此做了一個從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<ww; ++i){       x = i;       // 下面是個三點取出并繪制       // 實際中應該按照采樣率來設置間隔       y = hh-(int)(data[i*3]*k+hh/2);       System.out.print(y);       System.out.print(" ");       if(i!=0){         g.drawLine(x, y, prex, prey);       }       prex = x;       prey = y;     }   } } 

有了這些之后就可以調用繪制了,簡單的:

// 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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品极品在线观看| 久久久久久12| 亚洲欧美日韩一区二区在线| 欧美理论在线观看| 欧美孕妇性xx| 国产激情综合五月久久| 91在线直播亚洲| 97国产真实伦对白精彩视频8| 亚洲国产精品成人一区二区| 欧美美女操人视频| 亚洲美女av在线| 中文字幕亚洲欧美日韩2019| 亚洲人成网站777色婷婷| 欧美影院成年免费版| 9.1国产丝袜在线观看| 亚洲一级黄色av| 成人美女免费网站视频| 欧美成人精品xxx| 亚洲国产精品资源| 性色av一区二区三区在线观看| 91精品久久久久久久久久久久久久| 69av在线视频| 欧美亚洲第一区| 51视频国产精品一区二区| 精品成人国产在线观看男人呻吟| 国产精品美女久久| 国产精品视频成人| 美女福利视频一区| 亚洲精品小视频在线观看| 日韩av在线免费看| 欧美疯狂性受xxxxx另类| 成人天堂噜噜噜| 91大神在线播放精品| 日韩黄色av网站| 久久久久久高潮国产精品视| 久久精品久久久久| 国产在线拍揄自揄视频不卡99| 亚洲视频999| 日韩最新av在线| 亚洲第一av在线| 最新69国产成人精品视频免费| 日韩在线国产精品| 欧美激情国产高清| 欧美性生活大片免费观看网址| 久久精品国产久精国产思思| 国产日本欧美一区二区三区在线| 亚洲国产精品小视频| 97精品国产97久久久久久免费| 奇米4444一区二区三区| 亚洲国产婷婷香蕉久久久久久| 亚洲综合大片69999| 91亚洲国产成人精品性色| 一本一本久久a久久精品牛牛影视| 国产精品大陆在线观看| 亚洲精品中文字幕女同| 亚洲一区国产精品| 中日韩美女免费视频网址在线观看| 亚洲成人精品av| 国产成人精品日本亚洲专区61| 国产精品视频久久久久| 色综合91久久精品中文字幕| 欧美与黑人午夜性猛交久久久| 国产在线观看91精品一区| 欧美激情精品久久久久久免费印度| 久久久久久美女| 日韩精品极品在线观看播放免费视频| 日韩美女免费线视频| 国产精品免费一区二区三区都可以| 国产精品黄页免费高清在线观看| 亚洲国产欧美一区二区丝袜黑人| 国产狼人综合免费视频| 中文字幕久热精品视频在线| 亚洲视频一区二区三区| 国产一区二区三区四区福利| 久久精品中文字幕| 国产精品吴梦梦| 91夜夜未满十八勿入爽爽影院| 社区色欧美激情 | 国产精品专区一| 日韩中文综合网| 黑人精品xxx一区一二区| 欧美成人亚洲成人日韩成人| 国产精品久久久久aaaa九色| 国产精品免费视频久久久| 亚洲网在线观看| 欧美另类69精品久久久久9999| 午夜精品久久久久久久久久久久久| 国产精品久久久久久久app| 日韩一区二区福利| 国产精品一区二区av影院萌芽| 久久精品久久久久久国产 免费| 亚洲欧美日韩成人| 亚洲成人aaa| 欧美怡春院一区二区三区| 精品一区二区三区三区| 国产精品久久电影观看| 555www成人网| 国产精品成人aaaaa网站| 在线播放国产一区中文字幕剧情欧美| 成人国产在线视频| 国产精品电影观看| 精品久久久久久久久久| 国产香蕉97碰碰久久人人| 亚洲免费视频在线观看| 伊人av综合网| 久久免费国产精品1| 91av网站在线播放| 欧美主播福利视频| 韩国三级电影久久久久久| 精品无人区乱码1区2区3区在线| 国产精品第100页| 在线电影av不卡网址| 欧美成人免费va影院高清| 亚洲性av在线| 国产精品高清在线| 国产不卡在线观看| 另类图片亚洲另类| 欧美中文字幕在线| 欧美激情啊啊啊| 亚洲国产精品美女| 国产精品视频不卡| 亚洲一区二区三区四区在线播放| 91久久精品美女高潮| 成人a免费视频| 久久人体大胆视频| 日韩欧美精品中文字幕| 美女视频久久黄| 九九热精品视频国产| 久热精品视频在线观看| 国产+人+亚洲| 69av成年福利视频| 最新国产精品亚洲| 日韩美女福利视频| 亚洲精品大尺度| 最近2019中文免费高清视频观看www99| 午夜免费在线观看精品视频| 午夜精品一区二区三区在线| 欧美三级欧美成人高清www| 国产精品美腿一区在线看| 国产精品久久久久一区二区| 欧美性精品220| 欧美激情一区二区三区在线视频观看| 亚洲欧美在线一区二区| 成人av在线天堂| 亚洲精品国产成人| 日韩视频免费大全中文字幕| 亚洲国产中文字幕久久网| 日韩大片免费观看视频播放| 91免费的视频在线播放| 正在播放亚洲1区| 欧美激情第99页| 欧美www视频在线观看| 成人黄色av免费在线观看| 亚洲欧美国产一本综合首页| 亚洲欧美激情在线视频| 第一福利永久视频精品| 国产精品免费一区豆花| 日韩免费观看av| 深夜精品寂寞黄网站在线观看| 日韩免费观看高清| 亚洲综合一区二区不卡| 亚洲人a成www在线影院| 国产91精品不卡视频| 国产欧美日韩丝袜精品一区|