1

これは私の以前の質問のフォローアップです:いくつかのサウンドデータを1つの新しいサウンドデータにレンダリングしますか?

サウンドバンクとタイムオフセットを含むファイルを処理して、サウンドを再生する必要があるタイミングをマークし、そこからWaveファイルを生成するプログラムを作成しています。

したがって、FMOD_OUTPUTTYPE_WAVWRITERはこの仕事に最適だと思います。

サウンドバンクの場合、ファイル内で次のようなものを想像してください。

0 kick.wav
1 hit.wav
2 flute.wav

ここで、左側の数字は右側のサウンドファイル名のサウンドIDと、時間オフセットを示しています。

1000 0
2000 1
3000 2

ここで、左側の数字はプログラムにサウンドをミリ秒単位で再生する必要があることを示し、右側の数字はサウンドIDです。

したがって、プログラムを開始すると、FMODは、最初の1秒にキック(kick.wavから)、2番目の秒にヒット、3番目の秒にフルートを含むWaveファイルを生成します。タスクが完了するまで少なくとも3秒間。

ただし、より長い音楽、たとえば5分をレンダリングする場合は、指定されたオフセットでサウンドを再生するのはシステムタイマーに依存するため、タスクが完了するまで少なくとも5分待つ必要があります。ファイル内で、while(true)ループを実行してFMOD::Systemを更新します。たとえばSonyACIDのようなDAWプログラムで見たように、プログラムが実際に指定された時間にサウンドをレンダリングするのを待たずに、より速くレンダリングする方法があるはずだと思います。

次に、APIリファレンスを少し調べます。FMOD_OUTPUTTYPE_WAVWRITER_NRTがあります。これが解決策かもしれないと思ったので、何も変更せずに出力デバイスをすぐに変更しようとしましたが、生成されたWaveファイルの音が台無しになりました。繰り返し音が多く聞こえたり、長い遅延が発生したりします。

では、非リアルタイムバージョンを適切に使用するにはどうすればよいですか?私の場合、NRTを使用するときにfmodシステムを更新する正しい方法は何ですか?

fmodのドキュメント自体にNRT出力タイプの使用法についての明確な説明が見つかりませんでした。

とにかく、私はWindows環境でC++を使用しています。

ありがとう。

4

1 に答える 1

1

FMOD_OUTPUTTYPE_WAVEWRITER_NRTが機能する方法は、System::updateが呼び出されるたびにオーディオを生成することです。'update'ごとに生成されるデータの量は、System::setDSPBufferSizeのbufferlengthパラメーターによって制御されます。

したがって、System :: updateの呼び出しが速いほど、データの生成も速くなります。ここで、ジョブの重要な部分は、System::updateへの「x」回の呼び出しをタイムラインに一致するものに変換することです。

デフォルトでは、FMODは1秒あたり48000サンプルのサンプルレートで動作します(System :: setSoftwareFormatを介して構成可能)。したがって、「bufferlength」を1024に設定すると、System :: updateを呼び出すたびに1024サンプルが生成されます(wavファイルに書き込まれます)。つまり...1024/48000= 0.021333秒〜21.3ミリ秒のデータが呼び出しごとに生成されます。これで、System :: updateを呼び出して、現在のタイムスタンプを取得する必要がある回数を計算できます。

于 2012-02-02T03:54:51.540 に答える