「java音频分析」音频分析方法

博主:adminadmin 2022-11-22 12:23:10 53

本篇文章给大家谈谈java音频分析,以及音频分析方法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何用JAVA从视频中提取音频

把视频文件的后缀名改成MP3或者WMA就行了。不过这么做有一个缺点,这个音频会和原来的视频一样大(文件大小)。

java如何实现从视频中提取音频??????

1.你可以播放视频,然后java软件录制。

2.研究视频的编码格式,提取视频中包含的声音信息。java编码提取。没中视频格式都要具体分析。

3.有视频处理软件,直接提取。

求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有个音频流,AudioStream和一个播放音频流的类AudioPlayer

//FIlename 是你加载的声音文件,我记得mp3好像不行

InputStream in = new FileInputStream(Filename);

// 从输入流中创建一个AudioStream对象

AudioStream as = new AudioStream(in);

AudioPlayer.player.start(as);

AudioPlayer.player.stop(as);

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

您好,1 双方之间的网络连接

Java在这方面有其独特的优势,Java提供了丰富的网络类库的支持,可以轻松编写多种类型的网络通信程序。在我下面的例子中我就使用了TCP/IP协议,通过Java的Socket类进行编程。

2 音频信号的采集和回放以及音频数字信号的编码与解码

在解决这两个问题的时候,在网上很幸运地通过一些文章的介绍,找到了Answer Machine 演示程序的源代码(由of jsresources.org的Florian Bomers 和Matthias Pfisterer编写,网址)。在这个程序代码中,有几个解决我们问题所需要的类,而且作者将这些类封装的很好,我们基本不需要做什么改动,只需要屏蔽其中的调试信息的输出就行了,更可贵的是它还封装了几种常见的音频格式。其中的GSM格式(Global System for Mobile Telecommunications)就是我们下面例子中采用的压缩格式,GSM格式可以将128kbps 的音频数据流 (16bit通过8k Hz的音频采样) 压缩为13kbps 的音频数据流,非常适合语音信号的传送,所以可谓是一石二鸟。

我分析过这几个类的源代码,不得不佩服它的作者,每个类的源代码都很精炼,大家可以自己分析一下。好了下面就给大家讲讲这几个类,并且将它们用到的Java Sound API中的类和函数等一并做个简单介绍,让大家对Java Sound API中常用的类也有个大致的了解。由于Java Sound API中的类比较多。限于篇幅无法对所有用到的类做详尽的解释,以下内容只是简单提及了各个类的用途和使用规范,有关Java Sound 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编码解码库。大家需要在这里下载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播放音频的一些问题

调用的文件的路径问题,us.jpg和1231.mid所在的文件夹放在生成的class文件所在目录下,不然不能调用。我已经测试通过,代码改了下。参考下面代码:

import java.applet.*;

import java.net.URL;

import javax.swing.*;

public class asdasdsa extends JApplet {

private AudioClip audioClip;

public asdasdsa() {

URL url1 = getClass().getResource("image/us.jpg");

add(new JLabel(new ImageIcon(url1)));

URL url = getClass().getResource("audio/1231.mid");

audioClip = Applet.newAudioClip(url);

audioClip.loop();

}

@Override

public void start() {

if (audioClip != null) {

audioClip.loop();

}

}

@Override

public void stop() {

if (audioClip != null) {

audioClip.stop();

}

}

}

java音频分析的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于音频分析方法、java音频分析的信息别忘了在本站进行查找喔。

The End

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