簡體   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