欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java显示声音波形图示例

程序员文章站 2024-02-26 19:45:04
复制代码 代码如下:package _tmp; import java.awt.borderlayout;import java.awt.color;import jav...

复制代码 代码如下:

package _tmp;

import java.awt.borderlayout;
import java.awt.color;
import java.awt.graphics;
import java.awt.image;
import java.awt.toolkit;
import java.awt.image.bufferedimage;
import java.io.file;
import java.io.ioexception;
import java.util.arraydeque;
import java.util.deque;
import java.util.iterator;
import java.util.linkedlist;
import java.util.timer;
import java.util.timertask;

import javax.sound.sampled.audioformat;
import javax.sound.sampled.audioinputstream;
import javax.sound.sampled.audiosystem;
import javax.sound.sampled.sourcedataline;
import javax.swing.jframe;
import javax.swing.swingutilities;

public class soundtest {

 public static class waveformgraph extends jframe {

  private deque<short> deque = new linkedlist<short>();
  private timer timer;
  private image buffered;
  private image showing;

  public waveformgraph(int width, int height) {
   setsize(width, height);
   timer = new timer();
   buffered = new bufferedimage(width, height, bufferedimage.type_4byte_abgr);
   timer.schedule(new timertask() {
    @override public void run() {

     graphics g = buffered.getgraphics();
     g.setcolor(color.white);
     g.fillrect(0, 0, getwidth(), getheight());
     g.setcolor(color.black);

     g.translate(10, getheight()/2);

     synchronized (deque) {
      float heightrate = 1;
      if(deque.size() > 1) {
       iterator<short> iter = deque.iterator();
       short p1 = iter.next();
       short p2 = iter.next();
       int x1 = 0, x2 = 0;
       while(iter.hasnext()) {
        g.drawline(x1, (int)(p1*heightrate), x2, (int)(p2*heightrate));

        p1 = p2;
        p2 = iter.next();
        x1 = x2;
        x2 += 1;
       }
      }
     }
     g.dispose();

     swingutilities.invokelater(new runnable() {
      @override public void run() {
       showing = buffered;
       repaint();
       showing = null;
      }
     });
    }
   }, 100, 100);
  }

  @override
  public void paint(graphics g) {
   super.paint(g);
   if(buffered!=null) {
    g.drawimage(buffered, 0, 0, null);
   }
  }

  public void put(short v) {
   synchronized (deque) {
    deque.add(v);
    if(deque.size() > 500) {
     deque.removefirst();
    }
   }
  }

  public void clear() {
   deque.clear();
  }
 }

 public static void main(string[] args) throws exception {
//  record();
  waveformgraph waveformgraph = new waveformgraph(500, 300);
  waveformgraph.setdefaultcloseoperation(jframe.exit_on_close);
  waveformgraph.setvisible(true);

  audioinputstream ais = audiosystem.getaudioinputstream(new file("c:\\documents and settings\\wml\\my documents\\my music\\苏仨 - 失眠症.wav"));
  printformat(ais.getformat());
  

  sourcedataline player = audiosystem.getsourcedataline(ais.getformat());

  player.open();
  player.start();

  byte[] buf = new byte[4];
  int len;
  while((len=ais.read(buf))!=-1) {

   if(ais.getformat().getchannels() == 2) {
    if(ais.getformat().getsamplerate() == 16) {
     waveformgraph.put((short) ((buf[1] << 8) | buf[0]));//左声道

//     waveformgraph.put((short) ((buf[3] << 8) | buf[2]));//右声道
    } else {
     waveformgraph.put(buf[1]);//左声道
     waveformgraph.put(buf[3]);//左声道

//     waveformgraph.put(buf[2]);//右声道
//     waveformgraph.put(buf[4]);//右声道
    }
   } else {
    if(ais.getformat().getsamplerate() == 16) {
     waveformgraph.put((short) ((buf[1] << 8) | buf[0]));
     waveformgraph.put((short) ((buf[3] << 8) | buf[2]));
    } else {
     waveformgraph.put(buf[1]);
     waveformgraph.put(buf[2]);
     waveformgraph.put(buf[3]);
     waveformgraph.put(buf[4]);
    }
   }

   player.write(buf, 0, len);
  }

  player.close();
  ais.close();
 }

 public static void printformat(audioformat format) {
  system.out.println(format.getencoding() + " => "
    + format.getsamplerate()+" hz, "
    + format.getsamplesizeinbits() + " bit, "
    + format.getchannels() + " channel, "
    + format.getframerate() + " frames/second, "
    + format.getframesize() + " bytes/frame");
 }

// public static void record() throws lineunavailableexception,
//   interruptedexception {
//  audioformat audioformat = new audioformat(audioformat.encoding.pcm_signed, 48000f, 16, 1, 2, 48000f, false);
//  info recorddevinfo = new dataline.info(targetdataline.class, audioformat);
//
//  final targetdataline recordline = (targetdataline) audiosystem.getline(recorddevinfo);
//  final sourcedataline playline = audiosystem.getsourcedataline(audioformat);
//  
//  recordline.open(audioformat, recordline.getbuffersize());
//  playline.open(audioformat, recordline.getbuffersize());
//  
//  thread recorder = new thread() {
//   public void run() {
//    recordline.start();
//    playline.start();
//    
//    floatcontrol fc = (floatcontrol) playline.getcontrol(floatcontrol.type.master_gain);
//    double value = 2;
//    float db = (float) (math.log(value == 0.0 ? 0.0001 : value) / math.log(10.0) * 20.0);
//    fc.setvalue(db);
//    
//    try {
//     audioinputstream in = new audioinputstream(recordline);
//     byte[] buf = new byte[recordline.getbuffersize()];
//     int len;
//     while((len=in.read(buf)) != -1) {
//      playline.write(buf, 0, len);
//     }
//    } catch (ioexception e) {
//     e.printstacktrace();
//    } finally {
//     recordline.stop();
//     playline.stop();
//    }
//   };
//  };
//  recorder.start();
//  recorder.join();
// }
}