Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clip可以播放mp3,但OpenAL只提供静音功能(Java)_Java_Audio_Mp3_Openal_Audioinputstream - Fatal编程技术网

Clip可以播放mp3,但OpenAL只提供静音功能(Java)

Clip可以播放mp3,但OpenAL只提供静音功能(Java),java,audio,mp3,openal,audioinputstream,Java,Audio,Mp3,Openal,Audioinputstream,当我使用sound.sampled.Clip测试mp3文件时,它会按预期播放。然而,当我用OpenAL测试它时,我得到没有声音,也没有异常 (我正在使用JMF的mp3plugin.jar以及OpenAL库) 这是一个很难用简单代码演示的问题,因为使用openal需要许多库和一些设置代码,但是我已经尽了最大努力: public static void main(String[] args) throws Exception { init(); //initialises OpenAL's

当我使用sound.sampled.Clip测试mp3文件时,它会按预期播放。然而,当我用OpenAL测试它时,我得到没有声音,也没有异常

(我正在使用JMF的mp3plugin.jar以及OpenAL库)

这是一个很难用简单代码演示的问题,因为使用openal需要许多库和一些设置代码,但是我已经尽了最大努力:

public static void main(String[] args) throws Exception {
    init(); //initialises OpenAL's device, context and alCapabilities

    Thread.sleep(1000);

    System.out.println("Clip");

    AudioInputStream ais = AudioSystem.getAudioInputStream(new File("grumble.mp3"));
    ais = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, ais);        
    Clip clip = AudioSystem.getClip();
    clip.open(ais);
    clip.start(); //plays both wav and mp3

    Thread.sleep(2000);

    clip.close();
    ais.close();
    System.out.println("OpenAL");

    ais = AudioSystem.getAudioInputStream(new File("grumble.mp3"));
    ais = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, ais);
    AudioFormat format = ais.getFormat();
    byte[] byteArr = new byte[ais.available()];
    ais.read(byteArr);

    ByteBuffer buf = BufferUtils.createByteBuffer(byteArr.length);
    buf.put(byteArr);
    byteArr = null;
    ais.close();
    buf.flip();

    int buffer = alGenBuffers();
    alBufferData(buffer, getALFormat(format), buf, (int)format.getSampleRate() );
    int source = alGenSources();
    alSourcei(source, AL_BUFFER, buffer);

    alSourcePlay(source); //plays wav, but is silent when trying to play mp3

    Thread.sleep(2000);

    System.out.println("end");
    alDeleteSources(source);
    alcCloseDevice(device);
}

public static int getALFormat(AudioFormat format)
{
    int alFormat = -1;
    if (format.getChannels() == 1) {
        System.out.println("mono ");
        if (format.getSampleSizeInBits() == 8) {
            alFormat = AL_FORMAT_MONO8;
        } else if (format.getSampleSizeInBits() == 16) {
            alFormat = AL_FORMAT_MONO16;
        } else {
            System.out.println("sample size: "+format.getSampleSizeInBits());
        }
    } else if (format.getChannels() == 2) {
        System.out.println("stereo ");
        if (format.getSampleSizeInBits() == 8) {
            alFormat = AL_FORMAT_STEREO8;
        } else if (format.getSampleSizeInBits() == 16) {
            alFormat = AL_FORMAT_STEREO16;
        } else {
            System.out.println("sample size: "+format.getSampleSizeInBits());
        }
    }

    return alFormat;
}
这就是我在控制台中得到的全部信息:

Clip
OpenAL
stereo 
end

如果您想知道为什么我需要使用OpenAL,OpenAL提供了平移和俯仰操作,剪辑更容易处理。我已经能够平移和投掷我给它的任何wav文件,而Clip通常也做不到(并且在调整平移/增益时有延迟,而OpenAL是即时的)。

轻量级可能是一种适合您的替代方案。它提供实时音量、平移和俯仰控制。它是建立在javax.audio.sampled.SourceDataLine之上的。@Philfreihoff我正在努力避免许可的复杂性;如果可能的话,我宁愿找到一个使用OpenAL的解决方案,除非有很大的理由使用AudioCue而不是OpenAL?它可以在Java运行的任何平台上运行。它只使用核心java。主要的问题是解码mp3文件。如果可以将mp3数据解码为浮点数组,数据点范围为-1到1,则该数组可以用作音频提示的源数据。我想这方面有很多可用的库,例如,我很惊讶你在这方面没有得到任何帮助。也许用Ogg/vorbis而不是mp3来测试OpenAL代码?(它确实适用于.wav文件,是吗?)如果它适用于ogg/vorbis,Audacity(免费)可以用来制作ogg文件。我对JOrbis库有一点了解,也许可以帮助连接到我对OpenAL知之甚少但从未看过mp3解码器的网站。java-gaming.org有一个音频论坛,其中一些成员是libgdx的作者,也许他们可以在那里帮助你。那是老技术!这可能是你没有获得牵引力的部分原因。您可能会更幸运地尝试我上面链接的mp3库(goxr3plus)。至少对于它们(也是旧的),在试图解决这个问题时,您需要检查实际的源代码。