2017-09-13 4 views
0

LinuxでJavaオーディオを使用する際に問題があります。これはUbuntu 14.04のOpenJDK 8です。これが結果ですJavaオーディオがLinuxでwavファイルを再生できない

import java.net.URL; 
import javax.sound.sampled.*; 

public class PlaySound { 

    public void play() throws Exception 
    { 
     // List all mixers and default mixer 
     System.out.println("All mixers:"); 
     for (Mixer.Info m : AudioSystem.getMixerInfo()) 
     { 
      System.out.println(" " + m); 
     } 

     System.out.println("Default mixer: " + AudioSystem.getMixer(null).getMixerInfo()); 

     URL url = getClass().getResource("drop.wav"); 
     Clip clip; 

     AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); 
     clip = AudioSystem.getClip(); 
     System.out.println("Clip format: " + clip.getFormat()); 
     clip.open(audioInputStream); 

     clip.start(); 
     do { Thread.sleep(100); } while (clip.isRunning()); 
    } 

    public static void main(String [] args) throws Exception { 
     (new PlaySound()).play(); 
    } 
} 

::次のサンプルは、.wavファイルfrom this linkで失敗

All mixers: 
    PulseAudio Mixer, version 0.02 
    default [default], version 4.4.0-31-generic 
    Intel [plughw:0,0], version 4.4.0-31-generic 
    Intel [plughw:0,2], version 4.4.0-31-generic 
    NVidia [plughw:1,3], version 4.4.0-31-generic 
    NVidia [plughw:1,7], version 4.4.0-31-generic 
    NVidia [plughw:1,8], version 4.4.0-31-generic 
    NVidia [plughw:1,9], version 4.4.0-31-generic 
    Port Intel [hw:0], version 4.4.0-31-generic 
    Port NVidia [hw:1], version 4.4.0-31-generic 
Default mixer: default [default], version 4.4.0-31-generic 
Clip format: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian 
Exception in thread "main" java.lang.IllegalArgumentException: Invalid format 
    at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.createStream(PulseAudioDataLine.java:142) 
    at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:99) 
    at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:283) 
    at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402) 
    at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453) 
    at PlaySound.play(PlaySound.java:22) 
    at PlaySound.main(PlaySound.java:29) 

どうやら問題はPulseAudioはミキサーが選択されている、といくつかの理由で遊ぶことができないということです.wavファイル。

AudioSystem.getClip()コールをAudioSystem.getClip(null)に置き換えると、デフォルトのミキサーが選択されます。

互換性のあるミキサーが選択されていることを確認するにはどうすればよいですか?


アップデート:私は、「互換性」の形式を持っているものを見つけるまで、が利用できるミキサーをループ@Daveからの提案に続いて、私は、以下を参照してください。

ターゲットフォーマット(AudioInputStream.getFormat()から)すべてのミキサーを介し

PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian 

Iループ、各ミキサーのソースラインは、各ソースラインのためのフォーマットをサポートし、次のマッチを得る:ある

Mixer: PulseAudio Mixer, version 0.02 
Source line: interface SourceDataLine supporting 42 audio formats, and buffers of 0 to 1000000 bytes 
Format matches: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian 

私はは(format.matches()を使用して)一致を得るのですかまだ私はまだ「無効な形式」の例外を取得します。おそらく、 "不明なサンプルレート"と一致するフォーマットが表示され、クリップを開こうとすると実際に44100 Hzをサポートしていないことがわかりますか?

+0

必要です作業?あなたのここの例がおそらく問題の最小限の複製であることを理解しています。 – Dave

答えて

関連する問題