繁体   English   中英

Java 将音频从 44.1 kHz 转换为 48 kHz

[英]Java convert audio from 44.1 kHz to 48 kHz

我目前在将 AudioInputStream 从 MPEG1L3、44.1 kHz、每个样本未知位、未知帧大小和未知帧速率的立体声转换为 48KHz 16 位立体声签名 BigEndian PCM 时遇到了一些麻烦。

我已经尝试过使用

AudioSystem.getAudioInputStream(new AudioFormat(Encoding.PCM_SIGNED, 48000, 16, 2, 4, 48000, true), in);

但它总是给我这个错误:

java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian from MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, unknown frame rate,
        at java.desktop/javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:894)
        at me.joastuart.bot.audio.GetStreamTP.lambda$0(GetStreamTP.java:23)
        at java.base/java.lang.Thread.run(Thread.java:829)

可悲的是,我无法更改最终的音频格式,也无法更改输入的 AudioFormat。

我希望你能帮我解决这个问题

~乔阿斯图尔特

AFAIK,Java 不支持帧速率大于 44100 fps 的格式。 最新版本有变化吗?

可以使用AudioInputStream提取 PCM,并将 PCM 转换为更高的速率。 该过程类似于以稍快的速度播放文件,利用线性插值来获得位于现有 PCM 帧“之间”的数据值。 从那里,可以按照正确的顺序将 PCM 转换为字节(还有其他关于将 PCM 转换为字节的 stackoverflow 帖子)。

但我不知道如何将字节数组保存为可播放的 wav,其中 wav header 表示 48000 帧速率。 我只保存了 Java 支持的格式的 wav,并且不必处理 wav 标头,因为这通常由AudioSystem.write方法处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM