我有一个关于音频文件修改的简单问题。我可以通过输入流访问样本(解码等),但我无法找到一种方法来操作该输入流中的样本(可能是多个样本的情况)。
我想要实现的是获取一个文件 Ex A.mp3
,从中删除几秒钟,最后将其存储到一个新文件中。
通过查看JavaSoundApi examples ,我发现可以通过以下方式创建文件:
File fileOut = new File(someNewPathName);
AudioFileFormat.Type fileType = fileFormat.getType();
if (AudioSystem.isFileTypeSupported(fileType,audioInputStream)) {
AudioSystem.write(audioInputStream, fileType, fileOut);
}
最佳答案
您只需让 AudioInputStream谎言其大小即可。为此,您可以创建自己的 AudioInputStream 类,并使用对从声音 API 获取的普通 AudioInputStream 的委托(delegate)(仅骨架):
public class CuttingAudioInputStream extends AudioInputStream {
private AudioInputStream delegate;
public CuttingAudioInputStream(AudioInputStream delegate) {
this.delegate = delegate;
}
/**
* Lie about length of delegate
*/
public long getFrameLength() {
// simple demo, make the caller think the stream is 44100 samples long
return Math.min(delegate.getFrameLength(), 44100);
}
// Overrides for all other methods of AudioInputStream,
// left as excercise to the reader
}
您只需实现所有其他方法即可遵守您想要的限制。你也可以剪掉中间的部分,只是 read() 方法稍微复杂一点。
但是,我觉得有必要指出,如果源/目标是有损格式(例如 MP3 被解码并重新编码),则这种方法可能会降低音频质量。如果质量损失 Not Acceptable (仅当您多次处理同一流时才重要),您最好不解码文件,而是将剪切过程直接应用于编码数据。当然,这比较复杂(您需要对要处理的每种格式有很好的了解),并且不同格式对您可以剪切的位置有限制。
关于java - 修剪音频(mp3 或 wav 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11775232/