2017-07-16 9 views
0

私はオーディオを再生する必要があるJavaで書かれたアプリケーションを持っています。私はOpenAL(java-openalライブラリを使用)をタスクに使用しましたが、OpenALで直接サポートされていないWSOLAを使用したいと考えています。私はWSOLAをサポートしているTarsosDSPという素晴らしいJavaネイティブライブラリを見つけました。SourceDataLine形式のサポートに関する問題

ライブラリでは、オーディオ出力に標準のJava APIが使用されます。問題はSourceDataLineのセットアップ時に発生します。私は問題が権限の不足が原因ではないことを確認した

IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_UNSIGNED 16000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian is supported. 

(Windowsの10でそれを試みたのLinux +上のルートとしてそれを実行した)とで使用される他のSourceDataLinesはありませんプロジェクト。

フォーマットを変更した後、フォーマットがPCM_UNSIGNEDからPCM_SIGNEDに変更されたときにそのフォーマットが受け入れられることがわかりました。これは小さな問題のように思えますが、署名されていないバイト範囲のフォームを移動するのはかなり簡単です。しかし、ネイティブではサポートされていないのは変です。

私はソースデータを変更する必要がないいくつかのソリューションがありますか?

おかげで、月

答えて

1

あなたが手でバイト範囲を移動する必要はありません。 AudioInputStreamを作成した後は、署名されたフォーマットを持ち、最初の符号なしストリームに接続されている別のAudioInputStreamを作成します。署名付きストリームを使用してデータを読み込むと、Sound APIによって自動的にフォーマットが変換されます。この方法で、ソースデータを変更する必要はありません。

File fileWithUnsignedFormat; 

AudioInputStream sourceInputStream; 
AudioInputStream targetInputStream; 

AudioFormat sourceFormat; 
AudioFormat targetFormat; 

SourceDataLine sourceDataLine; 

sourceInputStream = AudioSystem.getAudioInputStream(fileWithUnsignedFormat); 
sourceFormat = sourceInputStream.getFormat(); 

targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
    sourceFormat.getSampleRate(), 
    sourceFormat.getSampleSizeInBits(), 
    sourceFormat.getChannels(), 
    sourceFormat.getFrameSize(), 
    sourceFormat.getFrameRate(), 
    false); 

targetInputStream = AudioSystem.getAudioInputStream(targetFormat, sourceInputStream); 

DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, targetFormat); 
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); 

sourceDataLine.open(targetFormat); 
sourceLine.start(); 


// schematic 
targetInputStream.read(byteArray, 0, byteArray.length); 
sourceDataLine.write(byteArray, 0, byteArray.length);