导航:首页 > 编程语言 > java对音频的处理

java对音频的处理

发布时间:2022-07-12 12:39:56

㈠ 求java大神请教一个问题,关于音频文件处理!

自己看吧!!!

package wav;
import javax.sound.sampled.*;

import java.io.*;
import java.net.*;

/**
* 播放音乐(支援WAV, AIFF, AU) 2011/10/09
*
* 2012/12/08
* 1.增加播放结束时callback
* 2.修正bug: 无限次播放时,无法stop()
*
* @version 2
* @author Ray(吉他手)
*/
public class AudioPlayer{
private AudioInputStream currentSound;

private Clip clip;

private float gain;
private FloatControl gainControl;

//控制声道,-1.0f:只有左声道, 0.0f:双声道,1.0f右声道
private float pan;
private FloatControl panControl;

//控制静音 开/关
private boolean mute;
private BooleanControl muteControl;

//播放次数,小于等于0:无限次播放,大于0:播放次数
private int playCount;

private DataLine.Info dlInfo;
private Object loadReference;
private AudioFormat format;

//音乐播放完毕时,若有设定回call的对象,则会通知此对象
private AudioPlayerCallback callbackTartet;
private Object callbackObj ;
private boolean isPause;

public AudioPlayer(){
AudioPlayerInit();
}

public void AudioPlayerInit(){
currentSound = null;
clip = null;
gain = 0.5f;
gainControl = null;
pan = 0.0f;
panControl = null;
mute = false;
muteControl = null;
playCount = 0;
dlInfo = null;
isPause = false;
}

/**
* 设定要接收音乐播放完时事件的对象
* @param cb 接收callback的对象
* @param obj callback回来的物件
*/
public void setCallbackTartet(AudioPlayerCallback cb, Object obj){
callbackTartet = cb;
callbackObj = obj;
}

/**
* 设定播放次数,播放次数,小于等于0:无限次播放,大于0:播放次数
* @param c
*/
public void setPlayCount(int c){
if(c < -1){
c = -1;
}
playCount = c - 1;
}

/**
* 指定路径读取音档,回传true:播放成功,false:播放失败
* @param filePath
* @param obj 目前物件放置的package路径
*/
public boolean loadAudio(String filePath){
try {
loadAudio(new File(filePath));
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}

/**
* 指定路径读取音档,使用目前物件放置的package当相对路径root,null时不使用物件路径为root
* @param filePath
* @param obj 目前物件放置的package路径
* @return 回传true:播放成功,false:播放失败
*/
public boolean loadAudio(String filePath, Object obj){
try {
if(obj != null){
loadAudio(obj.getClass().getResourceAsStream(filePath));
}else{
loadAudio(new File(filePath));
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}

/**
* 从远端读取音档
*/
public void loadAudio(URL url) throws Exception{
loadReference = url;
currentSound = AudioSystem.getAudioInputStream(url);
finishLoadingAudio();
}

/**
* 读取本地端音档
* @param file
* @throws Exception
*/
public void loadAudio(File file) throws Exception{
loadReference = file;
currentSound = AudioSystem.getAudioInputStream(file);
finishLoadingAudio();
}

/**
* 从串流读取音档
* @param iStream
* @throws Exception
*/
public void loadAudio(InputStream iStream) throws Exception{
loadReference = iStream;

if (iStream instanceof AudioInputStream){
currentSound = (AudioInputStream)iStream;
} else {
currentSound = AudioSystem.getAudioInputStream(iStream);
}
finishLoadingAudio();
}

/**
* load完音档后,进行播放设定
*/
protected void finishLoadingAudio() throws Exception {
format = currentSound.getFormat();
dlInfo = new DataLine.Info(Clip.class, format, ((int) currentSound.getFrameLength() * format.getFrameSize()));
clip = (Clip) AudioSystem.getLine(dlInfo);
clip.open(currentSound);
clip.addLineListener(
new LineListener() {
public void update(LineEvent event) {
if (event.getType().equals(LineEvent.Type.STOP)){
if(!isPause){
if(callbackTartet != null){
callbackTartet.audioPlayEnd(callbackObj);
}
close();
}
}
}
}
);
}

/**
* 播放音档
*/
public void play(){
if(clip != null){
clip.setFramePosition(0);
clip.loop(playCount);
}
}

/**
* 恢复播放音档
*
*/
public void resume(){
isPause = false;

if(clip != null){
clip.setFramePosition(clip.getFramePosition());
clip.loop(playCount);
}

}

/**
* 暂停播放音档
*/
public void pause(){
isPause = true;
if(clip != null){
clip.stop();
}
}

/**
* 停止播放音档,且将音档播放位置移回开始处
*/
public void stop(){
if(clip != null){
clip.stop();
}
}

/**
* 设定音量
* @param dB 0~1,预设为0.5
*/
public void setVolume(float dB){
float tempB = floor_pow(dB,1);
//System.out.println("目前音量+"+tempB);
gain = tempB;
resetVolume();

}

/**
* @param min 要无条件舍去的数字
* @param Num 要舍去的位数
*
*/
private float floor_pow(float min, int Num){
float n = (float)Math.pow(10, Num);
float tmp_Num = ((int)(min*n))/n;
return tmp_Num ;
}

/**
* 重设音量
*/
protected void resetVolume(){
gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
//double gain = .5D; // number between 0 and 1 (loudest)
float dB = (float) (Math.log(gain) / Math.log(10.0) * 20.0);
gainControl.setValue(dB);
}

/**
* 设定声道,-1.0f:只有左声道, 0.0f:双声道,1.0f右声道
* @param p
*/
public void setPan(float p){
pan = p;
resetPan();
}

/**
* 重设单双道、双声道
*/
protected void resetPan(){
panControl = (FloatControl) clip.getControl(FloatControl.Type.PAN);
panControl.setValue(this.pan);
}

/**
* 设定静音状态,true:静音,false:不静音
* @param m
*/
public void setMute(boolean m){
mute = m;
resetMute();
}

/**
* 重设静音状态
*
*/
protected void resetMute(){
muteControl = (BooleanControl) clip.getControl(BooleanControl.Type.MUTE);
muteControl.setValue(mute);
}

/**
*
* @return
*/
public int getFramePosition(){
try {
return clip.getFramePosition();
} catch (Exception e) {
return -1;
}
}

/**
* 取得音档格式
* @return
*/
public AudioFormat getCurrentFormat(){
return format;
}

/**
* 取得音档的串流
* @return
*/
public AudioInputStream getAudioInputStream(){
try {
AudioInputStream aiStream;

if (loadReference == null){
return null;
} else if (loadReference instanceof URL) {
URL url = (URL)loadReference;
aiStream = AudioSystem.getAudioInputStream(url);
} else if (loadReference instanceof File) {
File file = (File)loadReference;
aiStream = AudioSystem.getAudioInputStream(file);
} else if (loadReference instanceof AudioInputStream){
AudioInputStream stream = (AudioInputStream)loadReference;
aiStream = AudioSystem.getAudioInputStream(stream.getFormat(), stream);
stream.reset();
} else {

InputStream inputStream = (InputStream)loadReference;
aiStream = AudioSystem.getAudioInputStream(inputStream);
}

return aiStream;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

/**
* 目前音档是否已存在
* @return
*/
public boolean isAudioLoaded(){
return loadReference!= null;
}

/**
* 取得剪辑音档
* @return
*/
public Clip getClip() {
return clip;
}

/**
* 关闭音档
*/
public void close(){
try {
if (clip != null)
clip.close();
if (currentSound != null)
currentSound.close();
loadReference = null;
} catch (Exception e){
//System.out.println("unloadAudio: " + e);
e.printStackTrace();
}

currentSound = null;
clip = null;
gainControl = null;
panControl = null;
dlInfo = null;
loadReference = null;
muteControl = null;
callbackTartet = null;
callbackObj = null;
}

// public static void main(String [] args){
//
// }
}

㈡ java关于处理音频文件的问题

文件存放的格式是二进制,你不解析出来怎么能够判定你想要的东西
要不你就额外做一个什么管理

㈢ 在JAVA中怎么处理音频文件

java有个音频流,AudioStream和一个播放音频流的类AudioPlayer
//FIlename 是你加载的声音文件,我记得mp3好像不行
InputStream in = new FileInputStream(Filename);
// 从输入流中创建一个AudioStream对象
AudioStream as = new AudioStream(in);
AudioPlayer.player.start(as);
AudioPlayer.player.stop(as);

㈣ JAVA 实现音频播放

这个程序只要写对了音乐文件的URL地址,例如:new URL("file:/C:/tmp/1/Windows Ding.wav");
就可以播放音乐,除了可以播放.wav格式的音乐,还可以播放.au格式的音乐。
另外,如果你不希望音乐循环播放,你可以去掉audio1.loop();这一语句。
import java.applet.AudioClip;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JFrame;

public class D extends JFrame{
D(){
setSize(200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

URL codebase=null;
try {
codebase = new URL("file:/C:/tmp/1/Windows Ding.wav");
} catch (MalformedURLException e) {
e.printStackTrace();
}
AudioClip audio1=Applet.newAudioClip(codebase);
audio1.loop();
}
public static void main(String[] args) {
new D();
}
}

㈤ java中如何对arm音频文件进行FFT转换

首先要先把arm音频解码后,分帧处理(如128个样点),然后用fft函数就可以了。

㈥ 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编程:怎么播放一个音频

1.在Applet中播放声音
播放声音是java对多媒体的支持一个重要部分.
现今流行的声音格式有wav,mid,au为扩展名的声音文件。
而java现主要支持以au为名的声音。
在Applet中专门提供了类AudioClip来对声音的支持。
由于Applet的多媒体功能书上都有很清晰的介绍也很简单。
我们就以一个例子来结束这部分的说明。

import java.applet.*;
public class sounda extends Applet
{
public static void main (String[] args)

{
AudioClip ac = getAudioClip(getCodeBase(), "sloop.au");
ac.play();
// ac.loop();
// ac.stop();
}
}
2.上面例子只是很简单的说明,AudioClip是java中播放类。
java中提供了两个很有用的方法getCodeBase(),
getDocumentBase()他们分别返回Applet本身和包含此Applet主页的URL地址.
上面的sloop.au即机器上的声音文件。
直接使用了AudioClip的play方法来播放声音。
二 java应用程序中的声音播放
由于在应用程序并不支持AudioClip类。
所以播放声音文件成了一大难题。
sun公司为应用程序中的声音支持另提供了一个java新包。
sun.audio在这个包下面提供了大部分所需要的声音处理类。
注:sun包下面还有很多很有意思的技术支持,
如java2D,Tools等,
下面声音播放测试
import sun.audio.*;
2 imimport sun.audio.*;
import java.io.*;
public class Sound
{
public static voie main(String args[])
{
try {
FileInputStream fileau=new FileInputStream("sloop.au");
AudioStream as=new AudioStream(fileau);
AudioPlayer.player.start(as);
}
catch (Exception e) {}
}
}
注:上面两例都没有提供相应的stop方法,
三 javaX中Sound包的应用
当在进行上面的测试过程中,
发现javaX目录下也提供了一个sound包对java声音的强大支持,
并且在sun网站的jjse上可下载到相关的大量例子程序.
有志于声音处理方向的朋友可下载试试,
现在关于如何 在Java 小程序(Applet)中播放音乐以供人边浏览页面边欣赏的介绍已经很多了,
但对如何在应用程序(Application)中放音乐的介绍还很少,
下面就逐步地讲解一下如何实现。
Jun 当 前 的Java Development Kit 版本1.1.3 并不正式支持在Application 中放音乐文件,

㈧ java音频处理问题

为什么audioFormat.getChannels(), 一次后还要再一个audioFormat.getChannels()*2
每声道每帧字节数2字节,再加上双声道所以用声道数(2)*字节数(2) = 每帧的总字节数
看来你的audioFormat不是从AudioInputStream中产生的啊?刚才回答你的问题我还没注意。原来audioFormat也可以new出来的啊,嘿嘿。

㈨ 如何用java编程,实现声音特征的提取

您好,1 双方之间的网络连接
Java在这方面有其独特的优势,Java提供了丰富的网络类库的支持,可以轻松编写多种类型的网络通信程序。在我下面的例子中我就使用了TCP/IP协议,通过Java的Socket类进行编程。
2 音频信号的采集和回放以及音频数字信号的编码与解码
在解决这两个问题的时候,在网上很幸运地通过一些文章的介绍,找到了Answer Machine 演示程序的源代码(由of jsresources.org的Florian Bomers 和Matthias Pfisterer编写,网址http://www.jsresources.org/apps/am.html)。在这个程序代码中,有几个解决我们问题所需要的类,而且作者将这些类封装的很好,我们基本不需要做什么改动,只需要屏蔽其中的调试信息的输出就行了,更可贵的是它还封装了几种常见的音频格式。其中的GSM格式(Global System for Mobile Telecommunications)就是我们下面例子中采用的压缩格式,GSM格式可以将128kbps 的音频数据流 (16bit通过8k Hz的音频采样) 压缩为13kbps 的音频数据流,非常适合语音信号的传送,所以可谓是一石二鸟。
我分析过这几个类的源代码,不得不佩服它的作者,每个类的源代码都很精炼,大家可以自己分析一下。好了下面就给大家讲讲这几个类,并且将它们用到的Java Sound API中的类和函数等一并做个简单介绍,让大家对Java Sound API中常用的类也有个大致的了解。由于Java Sound API中的类比较多。限于篇幅无法对所有用到的类做详尽的解释,以下内容只是简单提及了各个类的用途和使用规范,有关Java Sound API中类的具体介绍请大家访问这里http://java.sun.com/j2se/1.4.2/docs/api/, 查找javax.sound.sampled的相关内容。
以下的提到几个文件是从Answer Machine 演示程序的源代码中提取出来的,由于是开放源代码的程序,大家在使用的时候请注意相关的公共协议。
① AMAudioFormat类(封装在AMAudioFormat.java文件中)
AMAudioFormat类封装了CD、FM、TELEPHONE、GSM这四种质量的音频格式的参数,使用起来也非常简单,这样我们在使用Java Sound API时就不用自己去写那些复杂的代码了,但为了明白Java Sound API的原理,我们需要对它的代码做一下分析。它使用了Java Sound API中的AudioFormat这个类,这个类非常重要,在Java中对任何音频数据的使用都要实现通过它指定所需要使用的音频格式,AudioFormat类有一个嵌套的类AudioFormat.Encoding,实际上大部分对AudioFormat类的使用都是使用的这个嵌套的类。
AMAudioFormat类的重要方法:
名称:getLineAudioFormat
调用格式:getLineAudioFormat(整型音频格式代号)
返回值: 根据传递音频格式代号生成的AudioFormat对象。
说道这里大家可能要问了,那么通过Java Sound API可以直接使用GSM格式吗?答案是比较复杂,但同样有解决的办法,作者在这里使用了另外的开源程序的类库-tritonus的GSM编码解码库。大家需要在这里www.tritonus.org/plugins.html下载tritonous_share.jar和tritonus_gsm.jar两个文件,并在AMAudioFormat类中引用,这样就完成了GSM格式的设置。需要告诉大家的是在对AMAudioFormat.java这个类进行编译后,我们的程序运行的时候就可以不需要tritonous_share.jar和tritonus_gsm.jar这两个文件的支持了。
② AudioCapture类(封装在AudioCapture.java文件中)
AudioCapture类封装了从音频硬件捕获音频数据并自动编码为GSM音频压缩数据的过程,并且通过它的getAudioInputStream()方法提供给我们一个音频数据输入流,我们就可以直接将这个流发送到网络中。
AudioCapture 类的重要方法:
名称:getAudioInputStream
调用格式:getAudioInputStream()
返回值:AudioInputStream对象
AudioCapture 类使用了Java Sound API中的AudioInputStream、AudioFormat、AudioSystem这几个类和TargetDataLine、LineListener接口。除了AudioFormat类我再简单介绍一下其他的类:
AudioInputStream 类是带有特殊音频格式和长度的InputStream类,它有两个构造方法,分别是AudioInputStream(InputStream stream, AudioFormat format,long length)和AudioInputStream(TargetData -Line line)。
TargetDataLine 接口是DataLine接口的一种,通过它就可以直接从音频硬件获取数据了,它有几个常用的方法,分别是:open(AudioFormat format)、void open(AudioFormat format, int bufferSize)、int read(byte[] b, int off, int len)。
AudioSystem 类是Java标准音频系统的入口点,在AudioSystem 类中使用他的getLine() 方法创建TargetDataLine对象。
LineListener接口用来对线路状态改变的时间进行监听,他的重要的方法是update(LineEvent event)方法。
③ AudioPlayStream类(封装在AudioPlayStream.java文件中)
AudioPlayStream类与AudioCapture类刚好相反,它封装了GSM压缩音频数据的解码和音频信号的回放过程,提供给我们一个音频信号输出流。AudioCapture类用到的Java Sound API中的类它也基本都用到了,只是它使用了SourceDataLine接口而不是TargetDataLine接口
④ Debug类(封装在Debug.java文件中)
Debug类主要用来在调试时输出讯息,代码很少,后来我把其中输出信息的语句都屏蔽了,对程序运行没有影响。
为了方便使用以上的几个类,我们需要对它们进行编译和打包,编译时需要设置相关的编译环境,以下是我们需要用到的命令
set CLASSPATH=%CLASSPATH%;.;tritonus_gsm.jar;tritonus_share.jar
javac am*.java amaudio*.java
jar cmf packagingmanifest.mf am.jar am*.class
amaudio*.class
说明一下,我将以上提到的Java源码文件放在了am目录下,编译之后可以得到一个8k的am.jar文件,我们下一步所需要做的就是在我们的程序中引用这个包。

阅读全文

与java对音频的处理相关的资料

热点内容
国产单片机厂商 浏览:56
苹果手机怎么设置不更新app软件 浏览:283
转行当程序员如何 浏览:491
苹果id怎么验证app 浏览:863
查看手机命令 浏览:952
抖音反编译地址 浏览:224
如何加密软件oppoa5 浏览:232
java从入门到精通明日科技 浏览:93
拆解汽车解压视频 浏览:595
新版百度云解压缩 浏览:591
android上下拉刷新 浏览:878
centos可执行文件反编译 浏览:836
林清玄pdf 浏览:270
黑马程序员java基础 浏览:283
awss3命令 浏览:358
百度店铺客户订单手机加密 浏览:501
钉钉班群文件夹怎么上传文件 浏览:749
人社app怎么解绑手机 浏览:101
caj文件夹打不开 浏览:475
什么app可以将电量变色 浏览:692