这是一个有点小问题的,语音录制并显示波形的程序,求大神指点

package yun;

import java.awt.Color;
//import java.awt.Dimension;
//import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//import java.awt.event.WindowAdapter;
//import java.awt.event.WindowEvent;
//import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
//import java.io.IOException;
//import java.io.InputStream;

import javax.sound.sampled.AudioFormat;
//import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
//import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public  class audio extends JFrame {
 //取得屏幕的宽度
 int  width=Toolkit.getDefaultToolkit().getScreenSize().width;
 //取得屏幕的高度
 int height =Toolkit.getDefaultToolkit().getScreenSize().height;
    //设置一个按钮用于监听声音
 public static JButton button1=new JButton("监听声音");
 public static JButton button2=new JButton("停止");
 public static JButton button3=new JButton("退出");
 //public static JButton button4=new JButton("播放");
 //public static JButton button5=new JButton("绘图");
 //定义一个面板来放置按钮
 JPanel pane2=new JPanel();
 //定义一个面板用于绘制波形
 panel jpanel=new panel();
 
 //实例化监听类
 public static MyActionListenerbutton1 bt1=new MyActionListenerbutton1();
 public static MyActionListenerbutton2 bt2=new MyActionListenerbutton2();
 public static MyActionListenerbutton3 bt3=new MyActionListenerbutton3();
 //public static MyActionListenerbutton4 bt4=new MyActionListenerbutton4();
 //public static MyActionListenerbutton5 bt5=new MyActionListenerbutton5();
 //控制录音标志
 public static boolean stopCapture = false;
 //采集数据是否准备好
  public static boolean dataready=true;
 //录音格式
 public static AudioFormat audioFormat;
 //读取数据:从TargetDataLine写入ByteArrayOutputStream录音
 public static ByteArrayOutputStream byteArrayOutputStream;
 public static int totaldatasize = 0;
    public static TargetDataLine targetDataLine;
    //录音缓冲数组
    public static byte[] tempBuffer=new byte[1024];
    //绘图缓冲区
    public static byte[] draw=new byte[1024];
    //播放数据:从AudioInputStream写入SourceDataLine播放
    //public static AudioInputStream audioInputStream;
    //public static SourceDataLine sourceDataLine;
   /** private byte[] audioDatas = null;
 private int intBytes = 0;
 private byte[] ml = new byte[1];
 private int[] drawl = null;**/
    static int[] drawl = null;
    private int intBytes = 0;
    //static byte [] bs=null;
 
 
 public audio(){
  //设置标题 
  this.setTitle("说话人识别"); 
  //设置窗体的大小 
  this.setSize(600,600); 
  //设置窗体的位置  
  this.setLocation((width-600)/2,(height-600)/2);
  //设置窗体的大小不可调整
  this.setResizable(false); 
  //设置退出方式  
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //绝对布局
  setLayout(null);
  //设置按钮面板位置
   pane2.setBounds(10,10,560,60);
   pane2.setBorder(BorderFactory.createLineBorder(Color.red));
  //加入按钮面板
   this.getContentPane().add(pane2);
   pane2.setLayout(null);
   //设置按钮的位置
    button1.setBounds(10,10,90,40);
   button2.setBounds(110,10,90,40);
   button3.setBounds(210,10,90,40);
  // pane2.add(button4);
   //pane2.add(button5);  
    //将按钮添加的按钮面板上
   pane2.add(button1);
   pane2.add(button2);
   pane2.add(button3);
   //设置绘图面板的位置及大小 
   jpanel.setBounds(10,100,560,200);
  //设置绘图面板的颜色
   jpanel.setBorder(BorderFactory.createLineBorder(Color.red));
  //加入绘制波形的面板
  this.getContentPane().add(jpanel);
  
  
  //注册监听
  button1.addActionListener(bt1);//监听
  button2.addActionListener(bt2);//停止
  button3.addActionListener(bt3);//退出
  //button4.addActionListener(bt4);//回放
  //button5.addActionListener(bt5);//绘图
  //设置状态
  button1.setEnabled(true);//监听
  button2.setEnabled(false);//停止
  button3.setEnabled(true);//退出
  //button4.setEnabled(false);//回放
  //button5.setEnabled(false);
  //绘图
  repaint();
       //设置窗体为可见
  this.setVisible(true);
 }
   
 //定义开始监听类按钮程序 
  public static class MyActionListenerbutton1 implements ActionListener{
   public void actionPerformed(ActionEvent e){
    button1.setEnabled(false);
    button2.setEnabled(true);
    button3.setEnabled(true);
    //button4.setEnabled(false);
    //button5.setEnabled(true);
    capture();//开始录音 
       }
  }
  //定义停止类监听程序
  public static class MyActionListenerbutton2 implements ActionListener{
   public void actionPerformed(ActionEvent e){
    button1.setEnabled(true);
    button2.setEnabled(false);
    button3.setEnabled(true);
    //button4.setEnabled(true);
    //button5.setEnabled(true);
    stop();//停止
   }
  }
  //定义退出类监听程序
  public static class MyActionListenerbutton3 implements ActionListener{
   public void actionPerformed(ActionEvent e){
       button1.setEnabled(false);
    button2.setEnabled(true);
    button3.setEnabled(true);
    //button4.setEnabled(true);
    //button5.setEnabled(true);
    exit();//退出
   }
  }
  //定义回放类监听程序
  /**public static class MyActionListenerbutton4 implements ActionListener{
   public void actionPerformed(ActionEvent e){
    play();//播放录音
   }
      }**/
  
  //录音
  public static void capture() {
   // TODO Auto-generated method stub
     //打开录音
      try {
       //获得录音格式
       audioFormat = getAudioFormat();
       //取得输入设备信息
       DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);
       //取得输入设备
       targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
       //打开输入设备
       targetDataLine.open(audioFormat);
       //开始录音
       targetDataLine.start();
       //创建独立线程进行录音
       Thread captureThread = new Thread(new CaptureThread());
       captureThread.start();
      } catch (LineUnavailableException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    System.exit(0);
   }
  }
  //播放类
  /**private static void play() {
   // TODO Auto-generated method stub
    try
     {
      //取得录音数据
      byte audioData[] = byteArrayOutputStream.toByteArray();
      //转换成输入流
      InputStream byteArrayInputStream = new ByteArrayInputStream(audioData);
      AudioFormat audioFormat = getAudioFormat();
      audioInputStream = new AudioInputStream(byteArrayInputStream,audioFormat, audioData.length / audioFormat.getFrameSize());
      DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat);
      sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
      sourceDataLine.open(audioFormat);
      sourceDataLine.start();
      //创建独立线程进行播放
      Thread playThread = new Thread(new PlayThread());
      playThread.start();
       }
     catch(Exception e)
     {
      e.printStackTrace();
      System.exit(0);
     }
  }**/
  //暂停
  private static void stop() {
   // TODO Auto-generated method stub
   stopCapture = true;
    }
  //退出
  private static  void exit() {
   System.exit(0);
  }
  
  //获取AudioFormat
  private static AudioFormat getAudioFormat()
   {
    float sampleRate = 16000.0F;//8000,11025,16000,22050,44100
    int sampleSizeInBits = 16;//8,16
    int channels = 1;//1,2
    boolean signed = true;//true,false
    boolean bigEndian = false;//true,false
    return new AudioFormat(sampleRate,sampleSizeInBits,channels,signed,bigEndian);
   }
  
  //录音线程
  private static class CaptureThread extends Thread
   {
   //读取录音数据,数据存放在tempbuffer数组中
    byte tempBuffer[]=new byte[1024];
    public void run()
    {
     byteArrayOutputStream = new ByteArrayOutputStream();
     totaldatasize = 0;
     stopCapture = false;
     try
     {
      while(!stopCapture)
      {
       //读取1024个数据
       int cnt = targetDataLine.read(tempBuffer,0,tempBuffer.length);
       dataready=true;
     //将采集到的数据存数绘图数组
    System.arraycopy(tempBuffer, 0, draw, 0, draw.length);
       if(cnt>0)
       {
        //保存该数据
        byteArrayOutputStream.write(tempBuffer, 0, cnt);
        totaldatasize += cnt; 
         /**输出tempBuffer数组中的数据
        for(int j=0;j<=tempBuffer.length;j++){
         System.out.println(tempBuffer[j]);
        }**/
       }
      }
      //将缓冲数组中的数据和大小,传送到数组bs中
           //   byte [] bs= byteArrayOutputStream.toByteArray();
            /**  for(int j=0;j<=bs.length;j++){
               System.out.println(bs[j]);
              }**/
             byteArrayOutputStream.close();
     }
     catch(Exception e)
     {
      e.printStackTrace();
      System.exit(0);
     }
    }
   }
  //绘图线程
     /**static  class drawthread extends Thread{
   public void run(){
    while(true){
     if(dataready){
         //将采集到的数据存数绘图数组
      //System.arraycopy(tempBuffer, 0, draw, 0, draw.length);
      //数据已经取走
      dataready=false;
         
     }
    }
   }
  }**/
  //播放线程
  /**private static class PlayThread extends Thread//播放线程
   {
    byte tempBuffer[] = new byte[1024];
    public void run()
    {
     try
     {
      int cnt;
      //读取数据到缓存数据
      while ((cnt=audioInputStream.read(tempBuffer,0,tempBuffer.length))!=-1)
      {
       if(cnt>0)
       {
        //写入缓存数据
        sourceDataLine.write(tempBuffer, 0, cnt);
       }
      }
     
      //Block等待临时数据被输出为空
      sourceDataLine.drain();
      sourceDataLine.close();
     }
     catch(Exception e)
     {
      e.printStackTrace();
      System.exit(0);
     }
    }
   }**/
  /**public void paint(Graphics g){
   for(int i=0;i<bs.length;i++){
    drawl[i]=Math.abs((int) bs[0]);
   }
   for(int i=0;i<drawl.length;i++){
    g.drawLine(i+100, drawl[i],(i+1)+100,drawl[i+1]);
   }
  }**/
  //jpanel画图的类
 class panel extends JPanel  {   
  public void paintComponent(Graphics g){
     /**while(true){
      if(dataready){
          //将采集到的数据存数绘图数组
       //System.arraycopy(tempBuffer, 0, draw, 0, draw.length);
       //数据已经取走
       dataready=false;
                 }
     }**/
       dataready=false;
   
    for(int i=0;i<draw.length;i++){ 
     drawl[i]=Math.abs((int) draw[0]);
     }
      for(int i=0;i<drawl.length;i++){
       g.drawLine(i+20,drawl[i],(i+1)+20,draw[i+1]);
      }
     /**  for(int i=0;i<bs.length;i++){
      drawl[i]=Math.abs((int) bs[0]);
     }
     for(int i=0;i<drawl.length;i++){
      g.drawLine(i+30, drawl[i],(i+1)+30,drawl[i+1]);
     }**/
  }
   }
  }
 这个程序 您帮我瞅瞅 哪里有问题。我定义了两个jpanel面板,能够正常显示,但是在paint中绘制动态的波形图时不能正常显示两个面板,而且波形还不能显示。这个程序是实现一边录音,一边绘制绘制出波形图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值