基于java的录音机源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);
}
}
}
}