猿问

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

我正在学习如何在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);

            }

萧十郎
浏览 138回答 2
2回答

Smart猫小萌

平移和音量控制取决于系统,即使安装到位,有时也会有些不稳定。例如,如果您一次更改音量或声相设置太多,则不连续会引起咔嗒声。一种解决方案是逐帧进入并自行进行更改。例如,请参阅教程“使用控件处理音频”末尾的“直接操作音频数据” 。有关示例,请参考下一篇教程中的代码:使用文件和格式转换器。在“读取声音文件”标题下查找并在代码“ \此处,执行有用的操作...”中查找注释。我邀请您也看看我编写并提供的代码,该类称为AudioCue,它具有实时平移以及实时音量和音高播放控件。我添加了平滑处理(用于平移更改的1024个步骤),以帮助减轻不连续的可能性。取mp3文件并将其解码为音频数据阵列将由您自己决定。我认为github上提供的javazoom库应该为您提供足够的代码访问权限,以弄清楚如何执行此操作(我在进行ogg / vorbis解码时就这样做了)。拥有音频数据的浮点数组(立体声,带符号的浮点范围从-1到1)后,可以将其直接加载到AudioCue中。

动漫人物

首先,多亏了安德鲁·汤普森(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();}}
随时随地看视频慕课网APP

相关分类

Java
我要回答