我需要播放一个大型音频文件,同时播放标记开头和该文件中的许多地方(一个音频记录包含许多问答对,所以我在听时手动解析这些对)。然后我需要获得一个单独的音频文件,其中只包含部分原始音频文件(在我按下startClip和endClip之间)。因此,一个音频文件将以这种方式标记并切割成多个文件(可能会遗漏某些部分,并且不会成为任何结果文件的一部分)。
文件格式是任意的,我可以将原始WMA转换为任何内容(JavaFX 8不支持WMA)。
我找不到任何方法。似乎标准API没有帮助: JavaFX声音api:[包javafx.scene.media] [1]
我也学到了一些合理的框架,但无法告诉他们:
Java OpenAL(JOAL) - 用于游戏/ 3D声音
LWJGL - 轻量级Java游戏库(支持图形(OpenGL),音频(OpenAL)和并行计算(OpenCL)的原生API) - 用于游戏/ 3D声音。
答案 0 :(得分:0)
import javax.sound.sampled.*;
我认为这个简单的代码可以帮助您:
class Sound {
protected String path;
protected AudioFormat format;
protected AudioInputStream sound2;
protected SourceDataLine ausgabe;
protected File soundfile;
protected DataLine.Info data;
protected byte buffer[]=new byte[1000000];
protected boolean isplaying=false;
protected boolean stop=false;
protected int speed=5;
protected int count=0;
public Sound(String path2) {
try {
path=path2;
soundfile=new File(path);
sound2 = AudioSystem.getAudioInputStream(soundfile);
format=sound2.getFormat();
data=new DataLine.Info(SourceDataLine.class,format);
ausgabe=(SourceDataLine) AudioSystem.getLine(data);
buffer=new byte[1000000];
} catch (Exception bug) {
System.out.println(bug);
}
}
public void reload(String path2) {
try {
path=path2;
soundfile=new File(path);
sound2 = AudioSystem.getAudioInputStream(soundfile);
format=sound2.getFormat();
data=new DataLine.Info(SourceDataLine.class,format);
ausgabe=(SourceDataLine) AudioSystem.getLine(data);
buffer=new byte[1000000];
} catch (Exception bug) {
System.out.println(bug);
}
}
public void setspeed(int speedn) {
speed=speedn;
}
public boolean isPlaying() {
return isplaying;
}
public void stop() {
stop=true;
}
public void play() {
try {
ausgabe.open(format);
ausgabe.start();
isplaying=true;
stop=false;
count=0;
while ((count=sound2.read(buffer,0,buffer.length)) != -1) {
if (stop==true) {
break;
}
/*try {
Thread.sleep(speed);
} catch(InterruptedException bug) {
Thread.currentThread().interrupt();
System.out.println(bug);
}*/
if (count > 0) {
ausgabe.write(buffer, 0, count);
}
}
count=0;
ausgabe.drain();
ausgabe.close();
isplaying=false;
} catch (LineUnavailableException bug) {
System.out.println(bug);
} catch (IOException bug) {
System.out.println(bug);
}
}
}
class Recorder {
protected String type;
protected AudioFileFormat.Type soundtype;
protected AudioFormat format;
protected TargetDataLine eingabe;
protected File writefile;
protected DataLine.Info data;
protected boolean isrecording=false;
protected boolean stop=false;
public Recorder(String pathn,String typen) {
try {
writefile=new File(pathn);
format=new AudioFormat(44100.0F,16,1,true,false);
data=new DataLine.Info(TargetDataLine.class,format);
if (typen=="AIFC") {
soundtype = AudioFileFormat.Type.AIFC;
}
if (typen=="AIFF") {
soundtype = AudioFileFormat.Type.AIFF;
}
if (typen=="WAVE") {
soundtype = AudioFileFormat.Type.WAVE;
}
if (typen=="AU") {
soundtype = AudioFileFormat.Type.AU;
}
if (typen=="SND") {
soundtype = AudioFileFormat.Type.SND;
}
eingabe=(TargetDataLine) AudioSystem.getLine(data);
} catch (Exception bug) {
System.out.println(bug);
}
}
public void format(float rate, int bits,int channels, boolean signed, boolean endian) {
format=new AudioFormat(rate,bits,channels,signed,endian);
}
public void settype(String typen) {
if (typen=="AIFC") {
soundtype = AudioFileFormat.Type.AIFC;
}
if (typen=="AIFF") {
soundtype = AudioFileFormat.Type.AIFF;
}
if (typen=="WAVE") {
soundtype = AudioFileFormat.Type.WAVE;
}
if (typen=="AU") {
soundtype = AudioFileFormat.Type.AU;
}
if (typen=="SND") {
soundtype = AudioFileFormat.Type.SND;
}
}
public void setname(String pathn) {
writefile = new File(pathn);
}
public boolean isRecording() {
return isrecording;
}
public void stop() {
try {
isrecording=false;
eingabe.stop();
eingabe.close();
} catch (Exception bug){
System.out.println(bug);
}
}
public void record() {
try {
isrecording=true;
eingabe.open(format);
eingabe.start();
AudioSystem.write(new AudioInputStream(eingabe),soundtype,writefile);
} catch (Exception bug){
System.out.println(bug);
}
}
}
class Arrayhelper {
public Arrayhelper() {
}
public int[][] append(int[][] array,int[] element) {
int[][] rarray = new int[array.length+1][];
for (int iter7=0;iter7 < array.length;iter7=iter7+1) {
rarray[iter7]=array[iter7];
}
rarray[array.length]=element;
return rarray;
}
public int[][] remove(int[][] array,int iterator) {
try {
int[][] rarray = new int[array.length-1][];
int rarray_iter=-1;
for (int iter8=0;iter8 < array.length;iter8=iter8+1) {
rarray_iter=rarray_iter+1;
if (iter8==iterator) {
rarray_iter=rarray_iter-1;
}
else {
rarray[rarray_iter]=array[iter8];
}
}
rarray_iter=0;
return rarray;
}
catch (java.lang.IndexOutOfBoundsException bug) {
System.out.println(bug);
System.out.println(Arrays.toString(array));
return array;
}
}
}
注意: 读取&#34;音量&#34;,音频文件正在改变音量。
count=sound2.read(buffer,0,buffer.length)
例如,如果您想要查看一个&#34;音调&#34;,只需将其调用两次即可。 因此,您可以提供剪切,创建一个大字节[],将整个声音文件读入其中,使用System.arraycopy剪切数组,并使用write函数将其全部写下来。