【问题标题】:Java audio change sample rateJava 音频更改采样率
【发布时间】:2021-09-10 12:10:31
【问题描述】:

如何更改音频文件的采样率?在我的应用程序中,我附加了多个 .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());

但这并不完全奏效,它会减慢音频并加重声音。

【问题讨论】:

  • 这需要独立于操作系统吗?如果没有,您使用的是哪个操作系统?

标签: java audio javasound sample-rate


【解决方案1】:

您不能只更改采样率,还必须更改帧率,这对于.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 作为后端进行重采样(完全公开,我是作者)。也许还有其他更适合您的平台的重采样器。

如果一切都失败了,我会考虑使用像SOXFFmpeg 这样的命令行工具。

【讨论】:

  • 感谢您的回复!我尝试同时更改采样率和帧率。转换成功,但声音变得越来越厚,越来越慢。这是预期的行为吗?
  • 不,听起来应该差不多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2017-03-04
  • 1970-01-01
  • 2015-07-06
  • 2011-01-06
  • 2019-02-06
  • 1970-01-01
相关资源
最近更新 更多