gpt4 book ai didi

java - 如何从 .mp3 文件获取平移控制?

转载 作者:行者123 更新时间:2023-12-02 11:00:43 24 4
gpt4 key购买 nike

我正在学习如何在 Java 中使用高级控件来播放声音。

我发现一个问题:javax.sound.sampled.AudioInputStream 不支持 Mp3 文件,而且我已经没有办法找到如何控制平移的方法了。

我设法使用javazoom.jl.player.advanced.AdvancedPlayer播放Mp3文件,但它没有平移控件,或者我还没有找到它。

我的实际代码打开一个文件,如果格式与AudioInputStream兼容,它只播放正确的 channel 。如果格式不支持,则使用 AdvancedPlayer 进行播放。

您知道如何获得 mp3 文件的平移控制吗?

我的代码:

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.advanced.AdvancedPlayer;

import javax.sound.sampled.*;
import javax.swing.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class AudioPlayerExample2 {
private static final int BUFFER_SIZE = 4096;

public static void main(String[] args) throws IOException, LineUnavailableException, JavaLayerException {
JFileChooser fileChooser = new JFileChooser();
fileChooser.showOpenDialog(null);

new AudioPlayerExample2().play(fileChooser.getSelectedFile());
}


void play(File file) throws IOException, LineUnavailableException, JavaLayerException {


AudioInputStream audioStream;

try {
audioStream = AudioSystem.getAudioInputStream(file);

AudioFormat format = audioStream.getFormat();
System.err.println(format.toString());

DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

SourceDataLine audioLine = (SourceDataLine) AudioSystem.getLine(info);

audioLine.open(format);

audioLine.start();

FloatControl pan = (FloatControl) audioLine.getControl(FloatControl.Type.PAN);

byte[] bytesBuffer = new byte[BUFFER_SIZE];
int bytesRead = -1;


while ((bytesRead = audioStream.read(bytesBuffer)) != -1) {
pan.setValue((float) (1));
audioLine.write(bytesBuffer, 0, bytesRead);
}

audioLine.drain();
audioLine.close();
audioStream.close();
} catch (UnsupportedAudioFileException e) {
FileInputStream fis = new FileInputStream(file);
AdvancedPlayer player = new AdvancedPlayer(fis);

player.play();
}


}
}

最佳答案

平移和音量控制取决于系统,即使它们就位,有时也可能有点不稳定。例如,如果您一次过多地更改音量或声相设置,则不连续性会导致咔嗒声。

一种解决方案是逐帧进入并自行进行更改。例如,请参阅教程末尾的“直接操作音频数据”Processing Audio with Controls .

例如,请查看下一个教程中的代码:Using Files and Format Converters 。查看“读取声音文件”标题下的内容,并在代码中查找注释“\Here, do some important...”

我邀请您也看一下我编写并提供的代码,一个名为 AudioCue 的类。具有实时平移以及实时音量和音高播放控制。我添加了平滑(平移更改的 1024 个步骤)以帮助减少不连续的可能性。

您可以获取 mp3 文件并将其解码为音频数据数组。我认为 github 上提供的 javazoom 库应该为您提供足够的代码访问权限来弄清楚如何做到这一点(我是为了 ogg/vorbis 解码而这样做的)。一旦您有了音频数据的 float 组(立体声,有符号浮点范围从 -1 到 1),就可以将其直接加载到 AudioCue 中。

关于java - 如何从 .mp3 文件获取平移控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51350595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com