基于java的录音机源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。



import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.InputStream;

import java.awt.Button;

import java.awt.Frame;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.sound.sampled.AudioFileFormat;

import javax.sound.sampled.AudioFormat;

import javax.sound.sampled.AudioInputStream;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.DataLine;

import javax.sound.sampled.SourceDataLine;

import javax.sound.sampled.TargetDataLine;

public class RecordPlay extends Frame {

boolean stopCapture = false; //控制录音标志

AudioFormat audioFormat; //录音格式

//读取数据:从TargetDataLine写入ByteArrayOutputStream录音

ByteArrayOutputStream byteArrayOutputStream;

int totaldatasize = 0;

TargetDataLine targetDataLine;

//播放数据:从AudioInputStream写入SourceDataLine播放

AudioInputStream audioInputStream;

SourceDataLine sourceDataLine;

public RecordPlay() {

//创建按钮

final Button captureBtn = new Button("录音");

final Button stopBtn = new Button("停止");

final Button playBtn = new Button("播放");

final Button saveBtn = new Button("保存");

captureBtn.setEnabled(true);

stopBtn.setEnabled(false);

playBtn.setEnabled(false);

saveBtn.setEnabled(false);

//注册录音事件

captureBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

captureBtn.setEnabled(false);

stopBtn.setEnabled(true);

playBtn.setEnabled(false);

saveBtn.setEnabled(false);

//开始录音

capture();

}

});

add(captureBtn);

//注册停止事件

stopBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

captureBtn.setEnabled(true);

stopBtn.setEnabled(false);

playBtn.setEnabled(true);

saveBtn.setEnabled(true);

//停止录音

stop();

}

});

add(stopBtn);

//注册播放事件

playBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

//播放录音

play();

}

});

add(playBtn);

//注册保存事件

saveBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

//保

存录音

save();

}

});

add(saveBtn);

//注册窗体关闭事件

addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

//设置窗体属性

setLayout(new FlowLayout());

setTitle("录音机程序");

setSize(350, 70);

setVisible(true);

}

//(1)录音事件,保存到ByteArrayOutputStream中

private void capture() {

try {

//打开录音

audioFormat = getAudioFormat();

dataLineInfo = new (

TargetDataLine.class, audioFormat);// 根据指定信息构造数据行的信息对象,这些信息包括单个音频格式

targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);//获得与指定 对象中的描述匹配的行

targetDataLine.open(audioFormat); //打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作

targetDataLine.start();//创建独立线程进行录音

Thread captureThread = new Thread(new CaptureThread());

captureThread.start();

} catch (Exception e) {

e.printStackTrace();

System.exit(0);

}

}

//播放ByteArrayOutputStream中的数据

private void play() {

try {

//取得录音数据

byte audioData[] = byteArrayOutputStream.toByteArray();

//转换成输入流

InputStream byteArrayInputStream = new ByteArrayInputStream(

audioData);

AudioFormat audioFormat = getAudioFormat();

audioInputStream = new AudioInputStream(byteArrayInputStream,

audioFormat, audioData.length / audioFormat.getFrameSize());
//使用指定输入流中的音频数据构造具有请求的格式和长度(以示例帧为单位)的音频输入流
dataLineInfo = new (

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);

}

}

//停止录音

public void stop() {

stopCapture = true;

}

//保存文件

public void sa

ve() {

//取得录音输入流

AudioFormat audioFormat = getAudioFormat();

byte audioData[] = byteArrayOutputStream.toByteArray();//创建一个新分配的字节数组

InputStream byteArrayInputStream = new ByteArrayInputStream(audioData);

audioInputStream = new AudioInputStream(byteArrayInputStream,

audioFormat, audioData.length / audioFormat.getFrameSize());
//使用指定输入流中的音频数据构造具有请求的格式和长度(以示例帧为单位)的音频输入流

//写入文件

try {

File file = new File("D:/test.wav");

AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, file);
// 将表示指定文件类型的音频文件的字节流写入所提供的外部文件
} catch (Exception e) {

e.printStackTrace();

}

}

//取得AudioFormat

private AudioFormat getAudioFormat() {

float sampleRate = 16000.0F;

//8000,11025,16000,22050,44100具有此格式的声音每秒播放或录制的样本数

int sampleSizeInBits = 16;

//8,16 每个具有此格式的声音样本中的位数

int channels = 1;

//1,2使用此格式的音频信道数(单声道为 1,立体声为 2)。

boolean signed = true;

//true,false可变比特率

boolean bigEndian = false;

//true,false指示是以 big-endian 顺序还是 little-endian 顺序存储音频数据

return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,

bigEndian);

}

public static void main(String args[]) {

new RecordPlay();

}

class CaptureThread extends Thread {

//临时数组

byte tempBuffer[] = new byte[10000];

public void run() {

byteArrayOutputStream = new ByteArrayOutputStream();

totaldatasize = 0;

stopCapture = false;

try {//循环执行,直到按下停止录音按钮

while (!stopCapture) {

//读取10000个数据

int cnt = targetDataLine.read(tempBuffer, 0,

tempBuffer.length);

if (cnt > 0) {

//保存该数据

byteArrayOutputStream.write(tempBuffer, 0, cnt);

totaldatasize += cnt;

}

}

byteArrayOutputStream.close();

} catch (Exception e) {

e.printStackTrace();

System.exit(0);

}

}

}

class PlayThread extends Thread {

byte tempBuffer[] = new byte[10000];

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);

}

}

}


}

相关文档
最新文档