私は純粋な Java オーディオ ミキシング ライブラリの作成をいじっています。できれば Android で使用できるもので、完全に実用的ではありませんが、間違いなく興味深いものです。私はそれがすでに行われていると確信していますが、私自身の学習経験のために、通常は回避する圧縮モデルがないため、wav ファイルでこれを実行しようとしています。
java.io の性質上、多くの InputStream タイプのクラスが定義されています。それぞれは、主に基礎となるリソースからデータを読み取るための操作を実装します。後でデータをどうするか、ダンプするか、独自のアドレス空間に集約するかなどは、あなた次第です。私はこれを純粋な Java にしたいと考えています。たとえば、何でも動作し (JNI は必要ありません)、低メモリ構成用に最適化され、拡張が簡単です。
RIFF 形式の性質と PCM サンプル データの組み立て方は理解できましたが、ファイルをメモリに展開するために必要なメモリを管理する最善の方法がわかりません。FileInputStream を使用すると、基盤となるファイル システムと読み取り操作の呼び出し方法に基づいて、一度に読み取られるデータの量が制限されます。FileInputStream は、後でミキシングするためにストリームを取得できないように、ファイル内の場所にインデックスを作成する方法を提供しません。私の目標は、RIFF ドキュメントを、基になるチャンクの適切な領域の読み取りと書き込みを可能にする Java オブジェクトに拡張することです。
すべての PCM サンプル データなど、全体にスペースを割り当てると、平均的な曲あたり 50 MB になります。一般的なスマートフォンまたはタブレットで、これが全体的なパフォーマンスに影響を与える可能性はどのくらいありますか? チャンクが InputStream のどこにあるかを追跡する独自の InputStream タイプを考えた方がよいでしょうか? ファイルの場合、これにより PCM サンプルを取得するときに多くのブロックが発生しますが、それでもシステムの全体的なメモリ フットプリントは削減されます。