java中直接使用AudioInputStream类来操作音乐文件,获取时长,实例如下:
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class AudioLength {
public static void main(String[] args) throws LineUnavailableException,
UnsupportedAudioFileException, IOException {
File file = new File("d:/test.wav");
Clip clip = AudioSystem.getClip();
AudioInputStream ais = AudioSystem.getAudioInputStream(file);
clip.open(ais);
System.out.println( clip.getMicrosecondLength() / 1000000D + " s" );//获取音频文件时长
}
}
② java音频文件的读写
Filefile=newFile("src.amr");
byte[]bts=newbyte[1024];
intlength=0;
try{
InputStreamstream=newFileInputStream(file);
OutputStreamos=newFileOutputStream(newFile("dest.amr"));
while((length=stream.read(bts))>0){
os.write(bts,0,length);
}
os.flush();
os.close();
stream.close();
}catch(Exceptione){
e.printStackTrace();
}
③ 如何用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闊虫簮鏄浠涔堟剰鎬濓紵
Java闊虫簮鏄鎸囧湪Java缂栫▼璇瑷涓浣跨敤鐨勯煶棰戞暟鎹锛岃繖浜涙暟鎹鍙浠ョ敤鏉ユ挱鏀鹃煶棰戝唴瀹广傚湪Java绋嬪簭涓锛屽紑鍙戜汉鍛樺彲浠ヤ娇鐢↗ava Audio API鏉ュ疄鐜伴煶棰戠殑褰曞埗銆佸勭悊鍜屾挱鏀剧瓑鍔熻兘銆傞氳繃杩欑嶆柟寮忥紝Java绋嬪簭鍙浠ラ潪甯告柟渚垮湴闆嗘垚闊抽戝唴瀹癸紝浠庤屽炲己搴旂敤绋嬪簭鐨勫氬獟浣撳姛鑳姐
Java闊虫簮鏄鍦↗ava骞冲彴涓婅繘琛屽紑鍙戠殑锛屽叾搴旂敤鑼冨洿闈炲父骞挎硾銆傚叿浣撴潵璇达紝Java闊虫簮鍙浠ヨ鐢ㄤ簬寮鍙戝氬獟浣撳簲鐢ㄧ▼搴忋佹父鎴忋佽嗛戠紪杈戝櫒绛変紬澶氶嗗煙銆傚叾搴旂敤鑼冨洿瓒婃潵瓒婂箍娉涳紝鍥犱负瀹冧笉浠呭叿鏈夐珮鏁堛佸畨鍏ㄣ佸彲闈犵瓑鐗圭偣锛岃屼笖鍙浠ュ拰鍏朵粬Java搴撶浉缁撳悎锛屽舰鎴愬己澶х殑绋嬪簭寮鍙戝钩鍙般
Java闊虫簮鐨勪紭鍔垮湪浜庡畠璺ㄥ钩鍙版уソ銆佺ǔ瀹氭ч珮銆佸彲鎵╁睍鎬у己绛夌壒鐐广備簨瀹炰笂锛孞ava闊虫簮鍙浠ヨ繍琛屽湪鍚勭嶄笉鍚岀殑鎿嶄綔绯荤粺涓婏紝浣垮緱绋嬪簭涓嶅繀鍙楅檺浜庝换浣曠壒瀹氱殑骞冲彴銆傛ゅ栵紝Java闊虫簮鍏锋湁鑹濂界殑绋冲畾鎬э紝鑳藉熶繚璇侀暱鏃堕棿杩愯屾椂鐨勭ǔ瀹氭у拰鍙闈犳с傚彟澶栵紝Java闊虫簮杩樺彲浠ラ氳繃鎵╁睍搴撴潵澧炲己鍏跺姛鑳斤紝杩涗竴姝ユ弧瓒崇敤鎴风殑闇姹傘
⑤ 用JAVA怎样捕获音频输出数据
import java.io.*;
import javax.sound.sampled.*;
import java.net.*;
/**
* Title: VoiceChat
* Description: 输出音频(放音程序)
* Copyright: Copyright (c) 2001
* Company:
* @author 网络
* @version 1.0
*/
class Playback implements Runnable {
final int bufSize = 16384;
SourceDataLine line;
Thread thread;
Socket s;
Playback(Socket s){//构造器 取得socket以获得网络输入流
this.s=s;
}
public void start() {
thread = new Thread(this);
thread.setName("Playback");
thread.start();
}
public void stop() {
thread = null;
}
public void run() {
AudioFormat format =new AudioFormat(8000,16,2,true,true);//AudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian)
BufferedInputStream playbackInputStream;
try {
playbackInputStream=new BufferedInputStream(new AudioInputStream(s.getInputStream(),format,2147483647));//封装成音频输出流,如果网络流是经过压缩的需在此加套解压流
}
catch (IOException ex) {
return;
}
DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);
try {
line = (SourceDataLine) AudioSystem.getLine(info);
line.open(format, bufSize);
} catch (LineUnavailableException ex) {
return;
}
byte[] data = new byte[1024];//此处数组的大小跟实时性关系不大,可根据情况进行调整
int numBytesRead = 0;
line.start();
while (thread != null) {
try{
numBytesRead = playbackInputStream.read(data);
line.write(data, 0,numBytesRead);
} catch (IOException e) {
break;
}
}
if (thread != null) {
line.drain();
}
line.stop();
line.close();
line = null;
}
}
import java.io.*;
import javax.sound.sampled.*;
import java.net.*;
/**
* Title: VoiceChat
* Description: 音频捕捉(录音程序)
* Copyright: Copyright (c) 2001
* Company:
* @author 网络
* @version 1.0
*/
class Capture implements Runnable {
TargetDataLine line;
Thread thread;
Socket s;
BufferedOutputStream captrueOutputStream;
Capture(Socket s){//构造器 取得socket以获得网络输出流
this.s=s;
}
public void start() {
thread = new Thread(this);
thread.setName("Capture");
thread.start();
}
public void stop() {
thread = null;
}
public void run() {
try {
captrueOutputStream=new BufferedOutputStream(s.getOutputStream());//建立输出流 此处可以加套压缩流用来压缩数据
}
catch (IOException ex) {
return;
}
AudioFormat format =new AudioFormat(8000,16,2,true,true);//AudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian)
DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);
try {
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format, line.getBufferSize());
} catch (Exception ex) {
return;
}
byte[] data = new byte[1024];//此处的1024可以情况进行调整,应跟下面的1024应保持一致
int numBytesRead=0;
line.start();
while (thread != null) {
numBytesRead = line.read(data, 0,1024);//取数据(1024)的大小直接关系到传输的速度,一般越小越快,
try {
captrueOutputStream.write(data, 0, numBytesRead);//写入网络流
}
catch (Exception ex) {
break;
}
}
line.stop();
line.close();
line = null;
try {
captrueOutputStream.flush();
captrueOutputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
⑥ 鎬庝箞閫氳繃C#鎴朖AVA寰楀埌浠庨害鍏嬮庡緱鍒板0闊虫垨瀹冪殑澹伴戞枃浠
JAVA澹伴煶 API杩涗竴姝ユ弿杩颁笁绉嶈惧囧瓙鐣岄潰:
InputDevice
銆銆InputDevice鐣岄潰鎻愪緵涓涓鏂规硶getInputChannel鏉ヨ幏寰椾竴涓狪nputChannel瀵硅薄锛屼粠涓鎹曡幏鍙璇荤殑闊抽戞暟鎹銆
OutputDevice
銆銆OutputDevice鐣岄潰鎻愪緵涓涓鏂规硶getOutputChannel鏉ヨ幏寰椾竴涓狾utputChannel瀵硅薄锛岄煶棰戞暟鎹鍙浠ュ啓鍏ヨヨ緭鍑洪氶亾锛屽苟浜堟挱鏀俱
銆銆Mixer
銆銆Mixer鏀鎸佸氫釜InputChannel鍜/鎴朇lip銆 鍙﹀,瀹冩彁渚涗簡鏌ヨ㈡柟娉曪紝浠庝腑鍙寰楀埌瀹冩墍鏀鎸佺殑閫氶亾鏁伴噺锛屽畠涔熸彁渚涗簡鏀鎸佸悓姝ユ殏鍋滃拰鍞ら啋澶氫釜閫氶亾鎾鏀剧殑鏂规硶銆
銆銆鎺т欢
閫氶亾鍜岄煶棰戠鍙 (姣斿傛壃澹板櫒鍜岄害鍏嬮)涓鑸鑳芥敮鎸佷竴缁勬帶浠舵瘮濡傚炵泭鍜屽畾浣嶃傞氳繃灏嗗畠鐨勭被浣滀负鍙傛暟浼犵粰getControl()鏂规硶锛孞AVA澹伴煶 API鐨勯氶亾瀵硅薄鍜岀鍙e硅薄鍙浠ヨ幏寰椾竴涓鐗瑰埆鐨勬帶浠躲
缂栫爜鍣
銆銆Codecs鍙浠ュ归煶棰戞暟鎹缂栫爜鍜岃В鐮侊紝鍏佽稿湪涓嶅悓鏍煎紡鍜岀紪鐮佷箣闂磋浆鎹銆侸AVA澹伴煶 API閫氳繃AudioSystem绫讳腑鐨勬柟娉曚负杩欎簺杞鎹㈡彁渚涗簡楂樼骇鎺ュ彛銆傚傛灉缁欎簡涓涓鐗规畩鐨勯煶棰戞祦锛屽簲鐢ㄧ▼搴忎細鏌ヨ㈤煶棰戠郴缁熸潵鎵惧埌鐩稿簲鐨勮浆鎹锛屼粠鑰屽緱鍒版寚瀹氭牸寮忕殑闊抽戞祦銆
鏂囦欢鍜屾祦
闊抽戞祦鏄涓庨煶棰戞暟鎹鏍煎紡鍜屾暟鎹闀垮害鐩稿叧鐨勮緭鍏ユ祦锛屾枃浠舵祦鏄涓庢枃浠剁被鍨嬪拰鏁版嵁闀垮害鐩稿叧鐨勮緭鍏ユ祦銆侸AVA澹伴煶 API鍦ˋudioSystem绫讳腑涓洪煶棰戞枃浠跺拰闊抽戞祦涔嬮棿鐨勮浆鎹㈡彁渚涗簡鎺ュ彛銆
鏌ヨ㈠拰璁块棶瀹夎呯粍浠
AudioSystem绫诲厖褰撳埌閲囨牱闊抽戠郴缁熻祫婧愬叆鍙g殑瑙掕壊銆傝ョ被鍏佽哥▼搴忓憳鏌ヨ㈠拰璁块棶杈撳叆璁惧囥佽緭鍑鸿惧囦互鍙婂畨瑁呭ソ鐨勬贩闊宠惧囥傚彟澶栵紝AudioSystem鍖呭惈璁稿氬湪涓嶅悓闊抽戞暟鎹鏍煎紡闂磋浆鎹㈢殑鏂规硶銆傚畠涔熸彁渚涗竴浜涙柟娉曪紝浣垮緱鍦ㄤ笉闇瑕佸硅惧囩洿鎺ユ搷浣滅殑鎯呭喌涓嬶紝鐩存帴鑾峰緱杈撳叆閫氶亾鎴栬緭鍑洪氶亾銆
浣犲彲浠ヨ瘯璇曞仛
⑦ java 切割wav音频
1.首先应该得到音乐文件的时长---这个可以网络,我也不会,但应该可以实现
2.然后得到文件大小,除以文件总分钟数
3.根据得到的大小切割文件(用二进制的方式读取文件)
⑧ java中如何获取音频(mp3)长度
1.采样率。
2.压缩格式。
基本上就跟这俩东西有关了。
有了这个以后,可以根据文件的大小来计算播放时长。
至于具体的,我也没算过。我觉得你可以cut一段音乐,比如wma格式的,看看一分钟是多大。然后用你的文件大小来和这个标准文件作比较。
还有其他方法就是借助外部包jar,也可使用JMF框架。
⑨ java 怎么获取音频文件时长
File source =new File('d:\test.mp3');
Encoder encoder = new Encoder();
MultimediaInfo m = encoder.getInfo(source);
long ls = m.getDuration();
ration = ls/1000;
System.out.println("此视频时长为:"+ls/60000+"分"+(ls/1000-ls/60000*60)+"秒!");
若用的是springmvc框架上传文件
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
Iterator<String> iter = multiRequest.getFileNames();
while(iter.hasNext()){
MultipartFile file = multiRequest.getFile(iter.next());
String fileOldName = file.getOriginalFilename();
long ration = 0;//音频长度,秒
CommonsMultipartFile cf= (CommonsMultipartFile)file;
DiskFileItem fi = (DiskFileItem)cf.getFileItem();
File source = fi.getStoreLocation();
Encoder encoder = new Encoder();
MultimediaInfo m = encoder.getInfo(source);
long ls = m.getDuration();
ration = ls/1000;}