我一直试图弄清楚如何从样本中减少一定的毫秒数。我的第一个问题是当我将此代码插入eclipse时。它告诉我AudioInputStream,AudioFileFormat和FileFormat不可用。如果我不能使用FileFormat,那么我无法将方法传递给其他方法来获得正确的计算以保存正确的音乐量。我甚至无法导入它们。但更重要的是,如何在不破坏算法完整性的情况下将参数“secondstocopy”更改为“millisecondstocopy”?对java来说还是新手,谢谢你的帮助!
// edit // FileFormat fileFormat = AudioSystem.getAudioFileFormat(file);看来我不能用这个代码的android。 getAudioFileFormat不起作用。由于.. int bytesPerSecond = format,我也无法计算fram率。 *(int)format.getFrameRate();如何正确获取媒体播放器的格式和帧速率,以便我可以计算bytesPerSecond和secondsToCopy? AudioSystem是JavaSound的一部分,JavaSound是桌面JVM / SDK的一部分。 Android JVM / SDK中不存在JavaSound,因此您的旧代码将无法在任何当前的Android SDK上编译。 I get an exception using java on android (java.lang.NoClassDefFoundError), why?
如何在没有javasound jvm / sdk的情况下计算文件格式和帧率以及内容。我现在可以告诉你声音是44100和16位的东西。在录制文件的获取信息窗格中,它表示总比特率:128,000,带有两个音频通道。我对编码的东西不太好,但是我用mac上的程序录制音频,名为wiretap pro。它告诉我参数。
import java.io.*;
import javax.sound.sampled.*;
class AudioFileProcessor {
public static void main(String[] args) {
copyAudio("/tmp/uke.wav", "/tmp/uke-shortened.wav", ƒ, 1);
}
public static void copyAudio(String sourceFileName, String destinationFileName, int startSecond, int secondsToCopy) {
AudioInputStream inputStream = null;
AudioInputStream shortenedStream = null;
try {
File file = new File(sourceFileName);
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
AudioFormat format = fileFormat.getFormat();
inputStream = AudioSystem.getAudioInputStream(file);
int bytesPerSecond = format.getFrameSize() * (int)format.getFrameRate();
inputStream.skip(startSecond * bytesPerSecond);
long framesOfAudioToCopy = secondsToCopy * (int)format.getFrameRate();
shortenedStream = new AudioInputStream(inputStream, format, framesOfAudioToCopy);
File destinationFile = new File(destinationFileName);
AudioSystem.write(shortenedStream, fileFormat.getType(), destinationFile);
} catch (Exception e) {
println(e);
} finally {
if (inputStream != null) try { inputStream.close(); } catch (Exception e) { println(e); }
if (shortenedStream != null) try { shortenedStream.close(); } catch (Exception e) { println(e); }
}
}
}
此代码取自:cutting a wave file