再生のために大規模なマルチサンプル オーディオ ファイルをメモリにロードする - 一時的なフリーズを回避する方法

StackOverflow https://stackoverflow.com/questions/2373094

質問

通常、サイズが約 50 MB の大きなオーディオ マルチサンプルを使用する必要があるアプリケーションを作成しています。1 つのファイルには約 80 個の短いサウンド録音が含まれており、アプリケーションでいつでも再生できます。このため、すべてのオーディオ データはメモリにロードされ、迅速にアクセスできるようになります。

ただし、これらのファイルのいずれかをロードする場合、メモリに書き込むまでに何秒もかかることがあります。つまり、プログラムが一時的にフリーズしていることになります。これを回避する良い方法は何でしょうか?Windows および OS X と互換性がある必要があります。これでフリーズします: myMultiSampleClass->open(); これは、多くの動的なメモリ割り当てと、ifstream を使用したファイルからの読み取りを行う必要があります。

私は 2 つの可能な選択肢を考えました。

  1. アプリケーション プロセスがフリーズしないように、ファイルを開いて別のスレッドでメモリにロードします。これを行うために Boost ライブラリを調べましたが、実装する準備が整う前にかなりの量を読む必要があります。スレッド内で open() 関数を呼び出し、その後スレッドを破棄するだけです。

  2. ファイル全体を一度にメモリにロードするのではなく、いわばその場でロードするだけのスキームを考えてください。問題は、どのサンプルがいつでもトリガーされる可能性があることです。他のソフトウェアにもこの種のシステムが導入されていることは知っていますが、それがどのように機能するかはわかりません。これは個々のコンピュータの仕様に大きく依存します。私のコンピュータではうまく動作する可能性がありますが、HDD/メモリが遅い人は非常に悪い結果になる可能性があります。私が考えたアイデアの 1 つは、各オーディオ録音の x 個のサンプルをメモリにロードし、再生する必要がある場合は、残りのオーディオをメモリにロードしながら、既存のサンプルの再生を開始するというものでした。

何かアイデアや批判はありますか?前もって感謝します :-)

役に立ちましたか?

解決

私の最初の試みとして溶液1のように - 。シンプル&ポイントへ

あなたがWindowsである場合は、非同期ファイル操作を行うことができます - <のhref = "http://msdn.microsoft.com/en-us/library/ms686358(VS.85).aspx" のrel =」彼らはOVERLAPPED を呼んでnofollowをnoreferrer "> - ファイルを読み込むと、それは準備ができたときにあなたが知っているようにOSに指示する

他のヒント

を使用するA メモリファイルをマッピングされました。ロード時間は、最初は「インスタント」であり、I / Oのオーバーヘッドが時間をかけて分散されます。

私は最善の解決策は、再生バッファの固定サイズに非同期I / Oを(ジョンDiblingに述べたように)を使用して再生中の時に小さなチャンク又は波データの単一のサンプルをロードすることであると思います。

戦略は、少なくとも、(これは遅延を少量加えるが、連続再生を保証します)バッファを再生しながら、あなたは(重なって)別のスレッド上の別の再生バッファを再入力することができます果たし、最初の再生バッファを埋めるだろうあなたは、バックグラウンドでのリフィルのために、再生のために1つずつ2つの再生バッファを持っている必要があり、その後、

リアルタイムでそれを切り替えます

後に、あなたはどのように大規模なクライアントPCのパフォーマンスに基づく再生バッファサイズ(それはメモリサイズと処理能力との間のトレードオフ、最速のCPUになります小さいバッファにため、低遅延を必要とします)を設定することができます。

検討してみてはいかがでしょうか 生産者と消費者 アプローチ。これには基本的に、1 つのスレッドを使用してサウンド データをバッファに読み取り、別のスレッドを使用してバッファからサウンド カードにデータをストリーミングすることが含まれます。

データ リーダーはプロデューサーであり、データをサウンド カードにストリーミングするのはコンシューマーです。バッファーがいっぱいになった場合にプロデューサーが読み取りを停止し、バッファーが少なくなった場合にプロデューサーが再び読み取りを開始できるように、最高水位マークと最低水位マークが必要です。

C++ プロデューサー/コンシューマー同時実行テンプレート ライブラリ
http://www.bayimage.com/code/pcpaper.html

編集: この種のことは難しいことを付け加えておきます。サンプル プレーヤーを構築している場合、システムの負荷は、どのキーが演奏されているか、一度に演奏されているサウンドの数、各サウンドの長さ、サステイン ペダルが押されているかどうか、などの関数として継続的に変化します。ハードディスクの速度やバッファリング、利用可能なプロセッサの馬力などのその他の要因も考慮されます。最終的に採用するプログラミングの最適化の中には、一見しただけでは明らかではないものもあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top