为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

萧十郎 2021-05-19 01:05:08
我正在学习如何在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);            }
查看完整描述

2 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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

一种解决方案是逐帧进入并自行进行更改。例如,请参阅教程“使用控件处理音频”末尾的“直接操作音频数据” 。

有关示例,请参考下一篇教程中的代码:使用文件和格式转换器。在“读取声音文件”标题下查找并在代码“ \此处,执行有用的操作...”中查找注释。

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

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


查看完整回答
反对 回复 2021-05-26
?
动漫人物

TA贡献1815条经验 获得超10个赞

首先,多亏了安德鲁·汤普森(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();

}

}



查看完整回答
反对 回复 2021-05-26
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信