5

小さな (<10 クラス) C++ プロジェクトを Java に移植しています。プロジェクトはサウンド ファイルを操作し、C++ ではlibsndfileを使用してこれを行います。コードには次のようなものが含まれます。

const int channels = audioFileInfo.channels;
...
sf_readf_double( audioFile, inputBuffer, MAX_ECHO );
...
sf_writef_double( outputAudioFile, &currentAudioBuffer[WINDOW_SIZE * channels], SEGMENTATION_LENGTH );

Javaでサウンドファイルを低レベルで操作する最良の方法は何ですか? 正規化、エコーの追加などについて話しています。

経過報告

少し掘り下げた後、javax.sound.sampledを見つけました。これでうまくいくようです。

編集 2com.sun.sound詳細な検査では、パッケージに依存しているため、機能しません (または、少なくとも使用可能な方法では機能しません) 。

編集 3さらに調査と実験を行うと、com.sun.soundsun.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 オブジェクトで作成する必要があります。誰でもこれを回避する方法を考えることができますか?

4

3 に答える 3

4

libsndfile は、ネイティブ開発キットを使用して Android 用にコンパイルできます。ライブラリを Android 用にコンパイルしたら、JNI を使用して Java からライブラリにアクセスできるようになります。

于 2010-10-29T00:44:34.380 に答える
0

このコードを C++ に保存しておき、JNIを介して Java で呼び出してみませんか?

于 2010-10-28T21:52:47.317 に答える
0

NDK を使用して libsndfile を移植できる場合は、NDK を使用して C++ コードを直接移植し、Java への移植を心配する必要はありません。

于 2010-11-08T04:59:06.123 に答える