0

さまざまなオーディオ出力で音楽を再生する必要があります。たとえば、music1 と music2 の 2 つの音楽があり、それらは異なるスピーカーの別々のスレッドで再生する必要があります。サウンドを再生できるオーディオ デバイスが複数あるとします。

私はこの方法を見つけました(ここでは - それはBasicPlayerです):

protected void createLine() throws LineUnavailableException
{
    log.info("Create Line");
    if (m_line == null)
    {
        AudioFormat sourceFormat = m_audioInputStream.getFormat();
        log.info("Create Line : Source format : " + sourceFormat.toString());
        int nSampleSizeInBits = sourceFormat.getSampleSizeInBits();
        if (nSampleSizeInBits <= 0) nSampleSizeInBits = 16;
        if ((sourceFormat.getEncoding() == AudioFormat.Encoding.ULAW) || (sourceFormat.getEncoding() == AudioFormat.Encoding.ALAW)) nSampleSizeInBits = 16;
        if (nSampleSizeInBits != 8) nSampleSizeInBits = 16;
        AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), nSampleSizeInBits, sourceFormat.getChannels(), sourceFormat.getChannels() * (nSampleSizeInBits / 8), sourceFormat.getSampleRate(), false);
        log.info("Create Line : Target format: " + targetFormat);
        // Keep a reference on encoded stream to progress notification.
        m_encodedaudioInputStream = m_audioInputStream;
        try
        {
            // Get total length in bytes of the encoded stream.
            encodedLength = m_encodedaudioInputStream.available();
        }
        catch (IOException e)
        {
            log.error("Cannot get m_encodedaudioInputStream.available()", e);
        }
        // Create decoded stream.
        m_audioInputStream = AudioSystem.getAudioInputStream(targetFormat, m_audioInputStream);
        AudioFormat audioFormat = m_audioInputStream.getFormat();
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat, AudioSystem.NOT_SPECIFIED);
        Mixer mixer = getMixer(m_mixerName);
        if (mixer != null)
        {
            log.info("Mixer : "+mixer.getMixerInfo().toString());
            m_line = (SourceDataLine) mixer.getLine(info);
        }
        else 
        {
            m_line = (SourceDataLine) AudioSystem.getLine(info);
            m_mixerName = null;
        }
        log.info("Line : " + m_line.toString());
        log.debug("Line Info : " + m_line.getLineInfo().toString());
        log.debug("Line AudioFormat: " + m_line.getFormat().toString());
    }
}

少しデバッグしたところ、ミキサーが常に null であることがわかりました。何故ですか?ターゲットラインから音を出すのはミキサーじゃないの?このプログラムは、常にコンピューターに設定されている既定のデバイスで再生されます。これを変更するにはどうすればよいですか?

4

1 に答える 1

0

私は実際、自分のプロジェクトの 1 つで Java Sound API を使い始めたばかりですが、私の理解では、Mixer は単なるインターフェースであり、オブジェクトではありません。それはあなたの問題の一部を説明することができます.

于 2012-12-04T16:47:40.083 に答える