如何更改音频文件的采样率?在我的应用程序中,我附加了多个.wav
格式的音频文件,其采样率为24,000 Hz,我希望将结果文件的采样率转换为20,050 Hz。我尝试创建一个新的AudioFormat
,并将采样率设置为20,050 Hz,如下所示:
appendedFiles = new AudioInputStream(
new SequenceInputStream(appendedFiles, clip),
new AudioFormat(appendedFiles.getFormat().getEncoding(),
20050,
appendedFiles.getFormat().getSampleSizeInBits(),
appendedFiles.getFormat().getChannels(),
appendedFiles.getFormat().getFrameSize(),
appendedFiles.getFormat().getFrameRate(),
appendedFiles.getFormat().isBigEndian()
),
appendedFiles.getFrameLength() + clip.getFrameLength());
但这并不能完全起作用,它会放慢声音的速度,使声音变厚。
发布于 2021-09-13 08:01:33
你不能只改变采样率,你还必须改变帧率,这对于.wav
(我猜所有未压缩的音频格式)都是相同的。因此,您需要做的第一件事是同时设置目标采样和帧速率。
您应该做的第二件事是涉及javax.sound.sampled.AudioSystem。它是Javasound中的核心类,不能被忽略。
使用AudioSystem
,您可以这样做(未测试的代码):
float targetRate = 20050;
// source audio format, you seem to assume
// it's the same for all files
AudioFormat sourceFormat = appendedFiles.getFormat();
// create an AudioInputStream for your two audio streams
AudioInputStream sourceStream = AudioSystem.getAudioInputStream(
new SequenceInputStream(appendedFiles, clip)
);
// construct the target format with the sample/frame rate
AudioFormat targetFormat = new AudioFormat(
appendedFiles.getFormat().getEncoding(),
targetRate,
sourceFormat.getSampleSizeInBits(),
sourceFormat.getChannels(),
sourceFormat.getFrameSize(),
targetRate,
sourceFormat.isBigEndian());
// let the AudioSystem resample your concatenated streams
resampledInputStream = AudioSystem.getAudioInputStream(targetFormat, sourceStream);
但有一点需要注意!AudioSystem
可能不支持所需的重采样因子。在这种情况下,您需要安装合适的服务提供商。对于Windows或Mac (目前仅限x86 ),你可以使用FFsampledSP,它支持以FFmpeg作为后端的重采样(完全公开,我是作者)。也许还有其他更适合您的平台的重采样器。
https://stackoverflow.com/questions/69132002
复制相似问题