网站首页 美食营养 游戏数码 手工爱好 生活家居 健康养生 运动户外 职场理财 情感交际 母婴教育 生活知识 知识问答

小程序如何实现录音 播放功能

时间:2024-10-23 01:30:10

1、第一步:创建一个java项目,打开myeclipse点击File--》New--》java project--》打开创建窗口输入名称(record)--》finish(完成)。代码界面如下所示:

小程序如何实现录音 播放功能小程序如何实现录音 播放功能小程序如何实现录音 播放功能

2、第二步:编辑文件首先在src下创建一个test包并在test包下新建一个类MyRecord短铘辔嗟具体步骤代码如下所示:package test;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.io.*;import javax.sound.sampled.*;public class MyRecord extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; // 定义录音格式 AudioFormat af = null; // 定义目标数据行,可以从中读取音频数据,该 TargetDataLine 接口提供从目标数据行的缓冲区读取所捕获数据的方法。 TargetDataLine td = null; // 定义源数据行,源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行,这样可处理字节缓冲并将它们传递给混频器。 SourceDataLine sd = null; // 定义字节数组输入输出流 ByteArrayInputStream bais = null; ByteArrayOutputStream baos = null; // 定义音频输入流 AudioInputStream ais = null; // 定义停止录音的标志,来控制录音线程的运行 Boolean stopflag = false; // 定义所需要的组件 JPanel jp1, jp2, jp3; JLabel jl1 = null; JButton captureBtn, stopBtn, playBtn, saveBtn; public static void main(String[] args) { // 创造一个实例 MyRecord mr = new MyRecord(); } // 构造函数 public MyRecord() { // 组件初始化 jp1 = new JPanel(); jp2 = new JPanel(); jp3 = new JPanel(); // 定义字体 Font myFont = new Font("华文新魏", Font.BOLD, 30); jl1 = new JLabel("录音机功能的实现"); jl1.setFont(myFont); jp1.add(jl1); captureBtn = new JButton("开始录音"); // 对开始录音按钮进行注册监听 captureBtn.addActionListener(this); captureBtn.setActionCommand("captureBtn"); // 对停止录音进行注册监听 stopBtn = new JButton("停止录音"); stopBtn.addActionListener(this); stopBtn.setActionCommand("stopBtn"); // 对播放录音进行注册监听 playBtn = new JButton("播放录音"); playBtn.addActionListener(this); playBtn.setActionCommand("playBtn"); // 对保存录音进行注册监听 saveBtn = new JButton("保存录音"); saveBtn.addActionListener(this); saveBtn.setActionCommand("saveBtn"); this.add(jp1, BorderLayout.NORTH); this.add(jp2, BorderLayout.CENTER); this.add(jp3, BorderLayout.SOUTH); jp3.setLayout(null); jp3.setLayout(new GridLayout(1, 4, 10, 10)); jp3.add(captureBtn); jp3.add(stopBtn); jp3.add(playBtn); jp3.add(saveBtn); // 设置按钮的属性 captureBtn.setEnabled(true); stopBtn.setEnabled(false); playBtn.setEnabled(false); saveBtn.setEnabled(false); // 设置窗口的属性 this.setSize(400, 300); this.setTitle("录音机"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("captureBtn")) { // 点击开始录音按钮后的动作 // 停止按钮可以启动 captureBtn.setEnabled(false); stopBtn.setEnabled(true); playBtn.setEnabled(false); saveBtn.setEnabled(false); // 调用录音的方法 capture(); } else if (e.getActionCommand().equals("stopBtn")) { // 点击停止录音按钮的动作 captureBtn.setEnabled(true); stopBtn.setEnabled(false); playBtn.setEnabled(true); saveBtn.setEnabled(true); // 调用停止录音的方法 stop(); } else if (e.getActionCommand().equals("playBtn")) { // 调用播放录音的方法 play(); } else if (e.getActionCommand().equals("saveBtn")) { // 调用保存录音的方法 save(); } } // 开始录音 public void capture() { try { // af为AudioFormat也就是音频格式 af = getAudioFormat(); DataLine.Info info = new DataLine.Info(TargetDataLine.class, af); td = (TargetDataLine) (AudioSystem.getLine(info)); // 打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作。 td.open(af); // 允许某一数据行执行数据 I/O td.start(); // 创建播放录音的线程 Record record = new Record(); Thread t1 = new Thread(record); t1.start(); } catch (LineUnavailableException ex) { ex.printStackTrace(); return; } } // 停止录音 public void stop() { stopflag = true; } // 播放录音 public void play() { // 将baos中的数据转换为字节数据 byte audioData[] = baos.toByteArray(); // 转换为输入流 bais = new ByteArrayInputStream(audioData); af = getAudioFormat(); ais = new AudioInputStream(bais, af, audioData.length / af.getFrameSize()); try { DataLine.Info dataLineInfo = new DataLine.Info( SourceDataLine.class, af); sd = (SourceDataLine) AudioSystem.getLine(dataLineInfo); sd.open(af); sd.start(); // 创建播放进程 Play py = new Play(); Thread t2 = new Thread(py); t2.start(); } catch (Exception e) { e.printStackTrace(); } finally { try { // 关闭流 if (ais != null) { ais.close(); } if (bais != null) { bais.close(); } if (baos != null) { baos.close(); } } catch (Exception e) { e.printStackTrace(); } } } // 保存录音 public void save() { // 取得录音输入流 af = getAudioFormat(); byte audioData[] = baos.toByteArray(); bais = new ByteArrayInputStream(audioData); ais = new AudioInputStream(bais, af, audioData.length / af.getFrameSize()); // 定义最终保存的文件名 File file = null; // 写入文件 try { // 以当前的时间命名录音的名字 // 将录音的文件存放到F盘下语音文件夹下 File filePath = new File("F:/语音文件"); if (!filePath.exists()) {// 如果文件不存在,则创建该目录 filePath.mkdir(); } file = new File(filePath.getPath() + "/" + System.currentTimeMillis() + ".mp3"); AudioSystem.write(ais, AudioFileFormat.Type.WAVE, file); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭流 try { if (bais != null) { bais.close(); } if (ais != null) { ais.close(); } } catch (Exception e) { e.printStackTrace(); } } } // 设置AudioFormat的参数 public AudioFormat getAudioFormat() { // 下面注释部分是另外一种音频格式,两者都可以 AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_SIGNED; float rate = 8000f; int sampleSize = 16; String signedString = "signed"; boolean bigEndian = true; int channels = 1; return new AudioFormat(encoding, rate, sampleSize, channels, (sampleSize / 8) * channels, rate, bigEndian); } // 录音类,因为要用到MyRecord类中的变量,所以将其做成内部类 class Record implements Runnable { // 定义存放录音的字节数组,作为缓冲区 byte bts[] = new byte[10000]; // 将字节数组包装到流里,最终存入到baos中 // 重写run函数 public void run() { baos = new ByteArrayOutputStream(); try { System.out.println("ok3"); stopflag = false; while (stopflag != true) { // 当停止录音没按下时,该线程一直执行 // 从数据行的输入缓冲区读取音频数据。 // 要读取bts.length长度的字节,cnt 是实际读取的字节数 int cnt = td.read(bts, 0, bts.length); if (cnt > 0) { baos.write(bts, 0, cnt); } } } catch (Exception e) { e.printStackTrace(); } finally { try { // 关闭打开的字节数组流 if (baos != null) { baos.close(); } } catch (IOException e) { e.printStackTrace(); } finally { td.drain(); td.close(); } } } } // 播放类,同样也做成内部类 class Play implements Runnable { // 播放baos中的数据即可 public void run() { byte bts[] = new byte[10000]; try { int cnt; // 读取数据到缓存数据 while ((cnt = ais.read(bts, 0, bts.length)) != -1) { if (cnt > 0) { // 写入缓存数据 // 将音频数据写入到混频器 sd.write(bts, 0, cnt); } } } catch (Exception e) { e.printStackTrace(); } finally { sd.drain(); sd.close(); } } }}

小程序如何实现录音 播放功能小程序如何实现录音 播放功能小程序如何实现录音 播放功能小程序如何实现录音 播放功能

3、第三步:测试代码。在类MyRecord中的main方法中右键选择run as 或debug as执行java代码,打开小程序窗口--》开始录音--》停止录音--》播放录音,保存录音,再次“开始录音”

小程序如何实现录音 播放功能小程序如何实现录音 播放功能小程序如何实现录音 播放功能小程序如何实现录音 播放功能小程序如何实现录音 播放功能

4、第四步:录音保存到F:\语音文件文件夹下,多次录音并不会覆盖原有的录音,因为每次生成的录音名称不同。

小程序如何实现录音 播放功能小程序如何实现录音 播放功能
© 2026 五度知识库
信息来自网络 所有数据仅供参考
有疑问请联系站长 site.kefu@gmail.com