導航:首頁 > 編程語言 > 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對音頻的處理相關的資料

熱點內容
erp是什麼伺服器 瀏覽:182
python中tmp 瀏覽:19
說明wpf加密過程 瀏覽:142
java讀取list 瀏覽:702
iis7gzip壓縮 瀏覽:39
有什麼安卓機打吃雞好 瀏覽:597
三星u盤加密狗 瀏覽:473
php函數的返回值嗎 瀏覽:586
國企穩定程序員 瀏覽:328
編程貓如何使用教程視頻 瀏覽:218
安卓遠端網頁如何打日誌 瀏覽:218
壓縮flash大小 瀏覽:993
解壓的玩具教程可愛版 瀏覽:366
哪個求職app比較靠譜 瀏覽:888
java的讀法 瀏覽:59
nod32區域網伺服器地址 瀏覽:1003
數碼科技解壓 瀏覽:236
新網的雲伺服器管理界面復雜嗎 瀏覽:367
無人聲解壓強迫症視頻 瀏覽:573
計算機編譯運行 瀏覽:640