package record;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.sound.sampled.*;
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(){
//create button
final Button captureB = new Button("record") ;
final Button stopB = new Button("stop") ;
final Button playB = new Button("play") ;
final Button saveB = new Button("save") ;
//启用组件
captureB.setEnabled(true) ;
stopB.setEnabled(true) ;
playB.setEnabled(true) ;
saveB.setEnabled(true) ;
//regist the RecordEvent
captureB.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
captureB.setEnabled(false) ;
stopB.setEnabled(true) ;
playB.setEnabled(false) ;
saveB.setEnabled(false) ;
//start record
capture() ;
}
}) ;
add(captureB) ;
//regist the StopEvent
stopB.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
captureB.setEnabled(true) ;
stopB.setEnabled(false) ;
playB.setEnabled(true) ;
saveB.setEnabled(true) ;
//stop record
stop() ;
}
}) ;
add(stopB) ;
//regist the PlayEvent
playB.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//play record
play() ;
}
}) ;
add(playB) ;
//regist the SaveEvent
saveB.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//save record
save() ;
}
}) ;
add(saveB) ;
//regist the windowClosingEvent
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0) ;
}
}) ;
//set the window attribute
setLayout(new FlowLayout()) ;
setTitle("录音机") ;
setSize(350,70) ;
setVisible(true) ;
}
//录音事件,保存到ByteArrayOutPutStream
private void capture(){
class CaptureThread extends Thread {
byte []tempBuffer = new byte[10000] ;
public void run(){
byteArrayOutputStream = new ByteArrayOutputStream() ;
totaldatasize = 0 ;
stopCapture = false ;
try{
while(!stopCapture){
int cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length) ;
if(cnt > 0){
//读取10000个数据
byteArrayOutputStream.write(tempBuffer,0,cnt) ;
totaldatasize += cnt ;
}
}
byteArrayOutputStream.close() ;
}catch(Exception e){
e.printStackTrace() ;
System.exit(0) ;
}
}
}
try{
//open the record
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()) ;
}catch(Exception e){
e.printStackTrace() ;
}
}
//播放ByteArrayOutputStream中的数据
public void play(){
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) ;
}
}
}
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) ;
}
}
//停止录音
public void stop(){
stopCapture = true ;
}
//保存文件
public void save(){
//取得录音输入流
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:/bianyi/workspace") ;
AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, file) ;
}catch(Exception e){
e.printStackTrace() ;
}
}
//取得AudioFormat
private AudioFormat getAudioFormat(){
float sampleRate = 16000.0f ;
int sampleSizeInBits = 16 ;
int channels = 1 ;
boolean signed = true ;
boolean bigEndian = false ;
return new AudioFormat(sampleRate,sampleSizeInBits,channels,signed,bigEndian) ;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new RecordPlay() ;
}
}
分享到:
相关推荐
【简易录音机】是一款实验性质的软件作品,其主要功能是提供声音的录制与播放功能。用户可以通过该软件新建声音文件进行录音,并将录制的内容保存到硬盘上。此外,它还具备播放已存储在硬盘上的声音文件的能力。界面...
"安卓Android源码——简易录音机.zip" 提供了一个基础的录音应用示例,这为我们深入理解Android音频录制机制提供了宝贵的资源。以下将详细阐述该录音机应用涉及到的核心知识点。 1. **Android MediaRecorder**: 这...
在Android平台上,开发一个简易录音机应用涉及到许多关键知识点,这些知识涵盖了Android应用程序的基本结构、音频处理、多媒体框架以及用户界面设计。以下是对这个"Android简易录音机源码"的详细解析: 首先,...
【简易录音机.zip】是一个包含Android源码的学习资源,适合对Android编程感兴趣的开发者,特别是对于初学者和正在进行毕业设计的学生。这个压缩包的核心是“简易录音机”这一应用的源代码,它涉及到Java语言和...
在安卓平台上,开发一款简易录音机应用涉及到许多关键知识点,这些知识点主要集中在Android系统的音频处理、用户界面设计以及文件管理等方面。以下是对这些知识点的详细解释: 1. **音频录制API**:Android提供了...
这可能是压缩包中的一个子目录或文件,包含了简易录音机应用的核心代码。可能包含Activity、Service、BroadcastReceiver等组件,以及与音频处理相关的类。开发者可以通过阅读这部分源码,了解如何集成录音和对讲...
【简易录音机_Android源码.zip】是一款基于Android平台的简单录音应用的源代码,它提供了基础的录音功能,适合初学者学习Android音频处理和应用开发。通过分析这个源码,我们可以深入理解Android中如何实现录音操作...
应用源码之简易录音机
2024电赛G题 , 简易超声波录音屏蔽系统方案+源代码+配置方法 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的参赛作品,代码都测试ok,都是运行成功后才上传资源,放心下载使用! 1、该资源内...
在Android平台上,开发一款简易录音机应用涉及到许多关键知识点,这些知识点主要涵盖Android系统的音频处理、用户界面设计以及应用程序架构。下面将详细讲解这些方面。 首先,Android的音频处理是通过MediaRecorder...
Windows XP系统自带的录音机是该操作系统中一个基础但实用的工具,主要用于捕捉声音并保存为音频文件。这个简易的录音软件虽然功能相对有限,但对于日常的语音记录、简单的声音编辑还是足够使用的。以下是关于...
1)通过话筒,利用声卡采集一段声音 2)显示该段声音的频率分析,分析特点,并存储起来 3)尝试根据存储的声音特色,区别不同的人 4)存储不同的声音,利用声卡实现回放
这个“安卓Andriod源码——简易录音机.zip”提供的代码应该包含了一个基本的录音应用实现,让我们来深入探讨一下相关知识点。 1. **音频录制API**:在Android中,我们主要使用`MediaRecorder`类来实现音频录制。这...
在Android平台上,开发一个简易录音机应用涉及到许多关键知识点,这些知识对于计算机科学与技术专业的学生进行毕业设计或深入理解Android应用开发至关重要。本项目是一个Android应用源码示例,旨在帮助开发者掌握...
基于LABVIEW的录音机的设计,能够实现录音
C#简易录音机,需要DirectX支持 仅有录音和停止两个键.停止后,需要引用directX , 在VS里面的引用->右键->添加引用里添加directX 和 directX.directsound两项 生成/bin/debug/test.wave
简易工控机程序打包简易工控机程序打包简易工控机程序打包简易工控机程序打包简易工控机程序打包简易工控机程序打包简易工控机程序打包简易工控机程序打包简易工控机程序打包简易工控机程序打包简易工控机程序打包...
在Android平台上,开发一款简易录音机应用涉及到许多关键知识点,这些知识对于深入理解Android系统以及提升应用程序开发技能至关重要。从标题"Android高级应用源码-简易录音机.zip"和描述中,我们可以推断出这个...