「java录音播放」java实现录音功能

博主:adminadmin 2022-12-25 18:54:07 56

本篇文章给大家谈谈java录音播放,以及java实现录音功能对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

JAVA 录音程序 帮我讲解下面这段程序吧。

你确定这个东西是播放的吗?我感觉她应该是存储到缓存当中了啊

大家好,我现在想用java在页面上实现一下录音和播放功能,想问下各位高手有啥好方法没?

页面上录音,那你的就是web程序,除非是applet程序,但是这样就有局限性,客户端必须安装jdk.

flex+java好像可以, 你可以研究下flex.

用java做一个可视化小程序,可以录音并予以保存。

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.InputStream;

import org.eclipse.swt.SWT;

import org.eclipse.swt.widgets.*;

import org.eclipse.swt.events.*;

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 {

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

AudioFormat audioFormat; // 录音格式

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

ByteArrayOutputStream byteArrayOutputStream;

int totaldatasize = 0;

TargetDataLine targetDataLine;

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

AudioInputStream audioInputStream;

SourceDataLine sourceDataLine;

private Button captureBtn;

private Button stopBtn;

private Button playBtn;

private Button saveBtn;

private Label myLabel;

private Shell shell;

private Display display;

public RecordPlay() {

super();

display = new Display();

shell = new Shell(display);

shell.setSize(350, 150);

shell.setText("录音机程序");

//

myLabel = new Label(shell, SWT.NONE);

myLabel.setBounds(38, 21, 100, 18);

myLabel.setText("录音机");

// 创建按钮

captureBtn = new Button(shell, SWT.NONE);

captureBtn.setBounds(30, 61, 60, 18);

captureBtn.setText("录音");

captureBtn.setEnabled(true);

stopBtn = new Button(shell, SWT.NONE);

stopBtn.setBounds(100, 61, 60, 18);

stopBtn.setText("停止");

stopBtn.setEnabled(false);

playBtn = new Button(shell, SWT.NONE);

playBtn.setBounds(170, 61, 60, 18);

playBtn.setText("播放");

playBtn.setEnabled(false);

saveBtn = new Button(shell, SWT.NONE);

saveBtn.setBounds(240, 61, 60, 18);

saveBtn.setText("保存");

saveBtn.setEnabled(false);

// 注册录音事件

captureBtn.addSelectionListener(new SelectionListener() {

public void widgetSelected(SelectionEvent event) {

captureBtn.setEnabled(false);

stopBtn.setEnabled(true);

playBtn.setEnabled(false);

saveBtn.setEnabled(false);

// 开始录音

capture();

}

public void widgetDefaultSelected(SelectionEvent event) {

// text.setText("No worries!");

}

});

// 注册停止事件

stopBtn.addSelectionListener(new SelectionListener() {

public void widgetSelected(SelectionEvent event) {

captureBtn.setEnabled(true);

stopBtn.setEnabled(false);

playBtn.setEnabled(true);

saveBtn.setEnabled(true);

// 停止录音

stop();

}

public void widgetDefaultSelected(SelectionEvent event) {

// text.setText("No worries!");

}

});

// 注册播放事件

playBtn.addSelectionListener(new SelectionListener() {

public void widgetSelected(SelectionEvent event) {

// 播放录音

play();

}

public void widgetDefaultSelected(SelectionEvent event) {

// text.setText("No worries!");

}

});

// 注册保存事件

saveBtn.addSelectionListener(new SelectionListener() {

public void widgetSelected(SelectionEvent event) {

// 保存录音

save();

}

public void widgetDefaultSelected(SelectionEvent event) {

// text.setText("No worries!");

}

});

}

public void start() {

shell.open();

while (!shell.isDisposed()) {

if (!display.readAndDispatch()) {

display.sleep();

}

}

}

public static void main(String[] args) {

RecordPlay label = new RecordPlay();

label.start();

}

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

private void capture() {

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 (Exception e) {

e.printStackTrace();

System.exit(0);

}

}

// (2)播放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());

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

}

}

// (3)停止录音

public void stop() {

stopCapture = true;

}

// (4)保存文件

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:/myjava/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

boolean signed = true;

// true,false

boolean bigEndian = false;

// true,false

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

bigEndian);

}

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

}

}

}

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

}

}

}

}

java如何播放声音

对声音媒体的直接支持可以说是Java的一大特色,尤其是在动画中配上声音效果,就可以使人在视觉上和听觉上均得到美的享受,那才叫过瘾。Java中播放声音文件与显示图像文件一样方便,同样只需要先将声音文件装载进来,然后播放就行了。

Java目前支持的声音文件只有一种格式,那就是SUN公司的AU格式(.AU文件),也称为u-law格式。由于AU格式的声音仅有8KHz的采样频率且不支持立体声效果,所以音质不算太好。唯一的好处就是AU声音文件的尺寸比其它格式小,有利于网上传输。一般,我们较熟悉的大都是WAV格式的声音文件,因此必须先将它们转换为AU格式(可以选用Goldwave软件来进行这种格式转换)。

声音文件准备好以后,就可以考虑将它装载进来并播放。在Applet类中提供的play( )方法可以将声音文件的装载与播放一并完成,其调用格式如下:

void play(URL url)

void play(URL url, String name)

可见,play( )方法的调用格式与getImage( )方法是完全一样的,也采用URL来定位声音文件。例如,某声音文件audio.au与applet文件存放在同一目录下,可以这样写:

play(getCodeBase( ),"audio.au");

一旦play( )方法装载了该声音文件,就立即播放。如果找不到指定URL下的声音文件,play( )方法不返回出错信息,只是听不到想听的声音而已。

由于play( )方法只能将声音播放一遍,若想循环播放某声音作为背景音乐,就需要用到功能更强大的AudioClip类,它能更有效地管理声音的播放操作。因为它被定义在java.applet程序包中,所以使用该类的话,不要忘了在程序头部加上:

import java.applet.AudioClip;

为了得到AudioClip对象,我们可以调用Applet类中的getAudioClip( )方法。它能装载指定URL的声音文件,并返回一个AudioClip对象,其调用格式如下:

AudioClip getAudioClip(URL url)

AudioClip getAudioClip(URL url, String name)

得到AudioClip对象以后,就可以调用AudioClip类中所提供的各种方法来操作其中的声音数据,这些方法如表4-4所示。

如果getAudioClip( )方法没有找到所指定的声音文件,就会返回null值。所以,在调用表4-4中所列的方法前,应该先检查一下得到的AudioClip对象不是null,因为在null对象上调用上述方法将导致出错。

如果需要的话,我们还可以在applet中同时装载几个声音文件来一起播放,到时候,这些声音将混合在一起,就象二重奏一样。另外还有一点要说明的是,如果我们使用AudioClip对象的loop( )方法来重复播放背景音乐时,千万不要忘记在适当的时候调用AudioClip对象的stop( )方法来结束放音,否则的话,即使用户离开这一Web页面,该声音也不会停止,这无疑将会惹恼用户。因此,一般我们都在applet的stop( )方法中添上停止播放的代码。

例如,下面这段程序将播放两段声音,一段是连续播放的背景音乐,另一段是讲话录音。

import java.applet.AudioClip;

public class Audios extends java.applet.Applet{

AudioClip bgmusic,speak;

public void init(){

bgmusic=getAudioClip(getDocumentBase(),"space.au");

speak=getAudioClip(getDocumentBase(),"intro.au");

}

public void start(){

if(bgmusic!=null)

bgmusic.loop();

if(speak!=null)

speak.play();

}

public void stop(){

if(bgmusic!=null)

bgmusic.stop(); //关闭背景音乐,切记。

}

}

package com.hongyuan.test;

import java.io.File;

import java.io.IOException;

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.UnsupportedAudioFileException;

public class MusicTest {

public static final String MUSIC_FILE = "相逢一笑.wav";

public static void main(String[] args) throws

LineUnavailableException,

UnsupportedAudioFileException, IOException {

// 获取音频输入流

AudioInputStream audioInputStream =

AudioSystem

.getAudioInputStream(new File(MUSIC_FILE));

//

获取音频编码对象

AudioFormat audioFormat = audioInputStream.getFormat();

// 设置数据输入

DataLine.Info dataLineInfo = new

DataLine.Info(SourceDataLine.class,

audioFormat,

AudioSystem.NOT_SPECIFIED);

SourceDataLine sourceDataLine =

(SourceDataLine)

AudioSystem

.getLine(dataLineInfo);

sourceDataLine.open(audioFormat);

sourceDataLine.start();

/*

* 从输入流中读取数据发送到混音器

*/

int count;

byte tempBuffer[]

= new byte[1024];

while ((count = audioInputStream.read(tempBuffer, 0,

tempBuffer.length)) != -1) {

if (count 0)

{

sourceDataLine.write(tempBuffer, 0, count);

}

}

//

清空数据缓冲,并关闭输入

sourceDataLine.drain();

sourceDataLine.close();

}

}

java如何实现录音的播放的java代码

去oracle官方下载java多媒体支持库 java media framework 安装完后自带的有例子,可以播放mp3,可以做视频监控,可以播放常规格式的电影文件

java可以做语音录音吗

可以。

需求:

1.实现可以从麦克风进行录音

2.可以停止录音

3.实现播放录音内容

4.并将所录的mp3文件全部存到F:/语音文件夹,语音的文件名以当前时间命名(java中是换算成秒),其中文件夹程序自己创建,不用担心出错

程序如下:

span style="font-size:18px;"import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.io.*;

import javax.sound.sampled.*;

public class MyRecord extends JFrame implements ActionListener{

//定义录音格式

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

// //采样率是每秒播放和录制的样本数

// float sampleRate = 16000.0F;

// // 采样率8000,11025,16000,22050,44100

// //sampleSizeInBits表示每个具有此格式的声音样本中的位数

// int sampleSizeInBits = 16;

// // 8,16

// int channels = 1;

// // 单声道为1,立体声为2

// boolean signed = true;

// // true,false

// boolean bigEndian = true;

// // true,false

// return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,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();

}

}

}

}/span

java录音播放的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java实现录音功能、java录音播放的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-25,除非注明,否则均为首码项目网原创文章,转载请注明出处。