嘿,我写了一个程序,可以从wav文件中剪切特定区域。 但是我意识到切口很难,所以我想淡入淡出。我的问题是我不知道如何在Java中实现该目标,因为我对Java的声音库非常陌生。
有人可以给我一个提示或技巧,如何实现这一点或给我可以找到答案的资源的提示?
这是我之前写的一些代码:
AudioInputStream in = null;
AudioInputStream out = null;
File originalFile = new File(filePath);
if (originalFile.exists() && originalFile.isFile())
{
File editedFile = new File(newPath);
try
{
in = AudioSystem.getAudioInputStream(originalFile);
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(originalFile);
AudioFormat format = fileFormat.getFormat();
int bytesPerSecond = format.getFrameSize() * (int) format.getFrameRate();
in.skip(start * bytesPerSecond);
long framesOfAudioToCopy = trackDuration * (int) format.getFrameRate();
// out is the audiostream which contains the output wav file
out = new AudioInputStream(in, format, framesOfAudioToCopy);
// so I guess here would be the right place to fade the audio file
// just before writing it to the disk
AudioSystem.write(out, fileFormat.getType(), editedFile);
System.out.println("Trimming done!");
System.out.println();
}
catch (UnsupportedAudioFileException e)
{
errorMessage = e.getMessage();
}
catch (IOException e)
{
errorMessage = e.getMessage();
}
答案 0 :(得分:1)
您可以尝试使用javax.sound.sampled a tutorial is here中提供的控件,但是我从来没有碰到太多运气。我的经验是,如果它们存在于给定的系统中(取决于pc / os,则仍然存在问题),因为卷更改仅发生在缓冲区边界。
请注意,本教程的最后部分建议直接处理音频。为此,需要多个步骤。
1)保留声音文件的各个字节
在下一个关于Using Files and Format Converters的教程中的“读取声音文件”部分中有一个代码示例。在此代码示例中,请注意我们在注释处标记了已提供访问各个字节的位置:
// Here, do something useful with the audio data that's
// now in the audioBytes array...
2)将字节转换为PCM(取决于音频格式)
3)乘以体积因子
4)增加或减少因子(如果褪色)
5)将PCM转换回字节
6)通过SourceDataLine打包和运送(同样取决于音频格式)
所有步骤都已在StackOverflow中进行了更详细的描述,并且应该可以搜索,尽管我不知道此时找到它们的难易程度。
有几个免费的库,它们允许实时音量衰减。我为此写了AudioCue(以及实时频率和声像),还有TinySound。
PS,我很乐意回答问题并提出改进建议,以改善我编写的图书馆的情况。