小さな (<10 クラス) C++ プロジェクトを Java に移植しています。プロジェクトはサウンド ファイルを操作し、C++ ではlibsndfileを使用してこれを行います。コードには次のようなものが含まれます。
const int channels = audioFileInfo.channels;
...
sf_readf_double( audioFile, inputBuffer, MAX_ECHO );
...
sf_writef_double( outputAudioFile, ¤tAudioBuffer[WINDOW_SIZE * channels], SEGMENTATION_LENGTH );
Javaでサウンドファイルを低レベルで操作する最良の方法は何ですか? 正規化、エコーの追加などについて話しています。
経過報告
少し掘り下げた後、javax.sound.sampledを見つけました。これでうまくいくようです。
編集 2com.sun.sound
詳細な検査では、パッケージに依存しているため、機能しません (または、少なくとも使用可能な方法では機能しません) 。
編集 3さらに調査と実験を行うと、com.sun.sound
とsun.misc
パッケージが GNU GPLv2 でリリースされ、プロジェクトにダウンロードしました。に名前を変更javax.sound.sampled
するimp.javax.sound.sampled
と、プロジェクトがコンパイルAudioFileFormat
され、まだ例外がスローされることなくオブジェクトを作成できます。まだあまり遊ぶ機会がありませんが、最新情報をお届けします。
編集 4 OK、javax.sound.sampled で動作するように見えるものもあれば、動作しないものもあります。たとえば、次のような呼び出しです。
AudioInputStream stream = AudioSystem.getAudioInputStream(waveFile));
動作しませんが、次のようにしてこれを回避できます。
WaveFileReader wfr = new WaveFileReader();
AudioInputStream stream = wfr.getAudioInputStream(waveFile);
AudioSystem.getAudioFileTypes()
一般に、空のリストを返すようなものへの呼び出し。パッケージを詳しく調べて、それがプロバイダーと関係があることを確認できますが、これを修正する方法がわかりません。オブジェクトを取得stream
すると、エンコーディングなどが正しく報告されます。これは励みになります。
現時点での私の大きな問題は、Clip オブジェクトを作成することです。これは、通常 AudioSystem から取得される Line オブジェクトで作成する必要があります。誰でもこれを回避する方法を考えることができますか?