如何获得.mp3文件的平移控制格式?

时间:2018-07-15 17:32:37

标签: java mp3 javasound panning

我正在学习如何在Java中播放声音,但要具有高级控件。

我发现了一个问题: javax.sound.sampled.AudioInputStream 不支持Mp3文件,并且我已经耗尽了寻找如何控制平移的想法。 / p>

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

我的实际代码将打开一个文件,如果格式与 AudioInputStream 兼容,则它将仅播放正确的频道。如果格式不正确,则使用 AdvancedPlayer 播放。

您知道一种对mp3文件进行平移控制的方法吗?

我的代码在这里:

            private void btnShowValueActionPerformed(java.awt.event.ActionEvent evt) {                                            
    // TODO add your handling code here:
    String strStart,strEnd, strNumbers;
    int intStart,intEnd, intNumber;
    strStart = this.txtEnterStart.getText();
    strEnd = this.txtEnterEnd.getText();
    intStart = Integer.parseInt(strStart);
    intEnd = Integer.parseInt(strEnd);
    for(int x = intStart; intEnd >= x; x++){
        strNumbers = Integer.toString(x);
        this.lblOutput.setText(strNumbers += x);
    }
}    

2 个答案:

答案 0 :(得分:1)

平移和音量控制取决于系统,即使安装到位,有时也会有些不稳定。例如,如果您一次更改音量或平移设置太多,则不连续会引起咔嗒声。

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

有关示例,请查看关于下一个教程的代码:Using Files and Format Converters。在标题“读取声音文件”下查找,并在代码“ \这里,做一些有用的事情……”中查找注释

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

由您决定要提取mp3文件并将其解码为音频数据数组。我认为github上提供的javazoom库应该为您提供足够的代码访问权限,以弄清楚如何执行此操作(我在进行ogg / vorbis解码时就这样做了)。一旦有了音频数据的浮点数组(立体声,带符号的浮点范围从-1到1),就可以将其直接加载到AudioCue。

答案 1 :(得分:0)

首先,感谢 Andrew Thompson和Phil Freihofner ,我很高兴成为这个社区的一员并得到信任的人。你真的感到很开心:)

我在这里留下了完全符合我想要的代码。

正如JavaZoom MP3 SPI文档所述:确保CLASSPATH中提供JLayer,Tritonus和MP3SPI库。

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

public class Test {
    public static void main(String[] args) throws IOException, 
UnsupportedAudioFileException, LineUnavailableException {
    JFileChooser chooser = new JFileChooser();
    chooser.showOpenDialog(null);
    String path = chooser.getSelectedFile().getAbsolutePath();

    System.err.println(path);
    File file = new File(path);

    AudioInputStream baseStream = AudioSystem.getAudioInputStream(file);

    AudioFormat baseFormat = baseStream.getFormat();

    System.err.println(baseFormat.toString());
    AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
baseFormat.getSampleRate(),
            16, baseFormat.getChannels(), baseFormat.getChannels() * 2, 
baseFormat.getSampleRate(), true);

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

    AudioInputStream stream = AudioSystem.getAudioInputStream(format, baseStream);

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


    audioLine.open(format);
    audioLine.start();

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

    pan.setValue(1);

    int BUFFER_SIZE = 4096;

    byte[] buffer = new byte[BUFFER_SIZE];

    int read = -1;

    while((read = stream.read(buffer)) != -1){
        audioLine.write(buffer, 0, read);
    }

    audioLine.drain();
    audioLine.close();
}
}