【发布时间】:2018-12-23 08:07:22
【问题描述】:
我正在学习如何在 Java 中播放声音,但要使用高级控件。
我发现了一个问题:javax.sound.sampled.AudioInputStream 不支持 Mp3 文件,而且我找不到如何控制平移的想法。
我设法使用 javazoom.jl.player.advanced.AdvancedPlayer 播放了一个 Mp3 文件,但它没有平移控件,或者我没有创建它。
我的实际代码打开一个文件,如果格式与AudioInputStream兼容,它只播放正确的通道。如果格式不正确,则使用 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();
}
}
}
【问题讨论】:
-
您也可以尝试使用 JavaFX 媒体播放器。 (另见stackoverflow.com/q/6045384/2891664.)
-
“不支持 Mp3 文件” 请参阅“服务提供者接口”下的 Java Sound info. page。
标签: java mp3 javasound panning