[英]Trimming audio (mp3 or wav file)
我有一个关于音频文件修改的快速问题。 我可以通过输入流(解码等)访问样本,但是无法找到一种在该输入流中处理样本的方法(可能是多个样本的情况)。
我要实现的是获取Ex A.mp3
文件, A.mp3
删除几秒钟,最后将其存储到新文件中。
通过查看JavaSoundApi示例 ,我发现可以通过以下方式创建文件:
File fileOut = new File(someNewPathName);
AudioFileFormat.Type fileType = fileFormat.getType();
if (AudioSystem.isFileTypeSupported(fileType,audioInputStream)) {
AudioSystem.write(audioInputStream, fileType, fileOut);
}
你只需要做出的AudioInputStream 谎言关于它的大小。 为此,您可以创建自己的AudioInputStream类,并使用委派给从声音API获得的普通AudioInputStream(仅骨架):
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进行解码和重新编码),则此方法可能会降低音频质量。 如果质量损失是不可接受的(仅当您多次处理相同的流时才有意义),最好不要解码文件,而是将剪切过程直接应用于编码数据。 当然,这更加复杂(您需要对要处理的每种格式有充分的了解),并且在不同的格式下可以进行剪切的位置受到限制。
您的教程适用于Java 1.5! 有更多最新版本。
在您引用的页面上,“读取声音文件”标题下有一些示例代码。 注意带有注释的区域:
// Here, do something useful with the audio data that's
// now in the audioBytes array...
这是在while循环中读取audioInputStream的地方。 如果在帧通过该区域时对其进行跟踪,则可以计算经过的时间。 可以将加载的数据保存到字节数组。 也许所需帧中的数据可以是读取audioInputStream并实现TargetDataLine的类的输出。 如果我没记错的话,可以使TargetDataLine与AudioSystem.write(...
我不知道直接编辑压缩数据甚至是wav。 WAV格式不统一,没有统一的标头。 这就是为什么我要让Java读取流,并在以这种方式公开数据时使用数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.