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

标签 java mp3 javasound panning

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

相关文章:

Java XML DOM 整型值

java - 使用pjsip播放mp3文件

java - Android上用于waveTable合成的API

android - MediaExtractor.advance() - 比预期更早发出流结束信号

java - 如何在 Android 中复用 mp3 和 mp4 文件

Python:解码mp3

java - Java声音API。从调音台获取支持的音频格式

java - 在@ManyToOne 端合并托管实体

java - Webview自动输入密码的方法

java - 如何创建使用方法的链接列表数组