2

私は現在、動的に作成された音楽が再生されている小さなゲームをプログラミングしており、特定のトーンで、ゲームを更新するための関数が呼び出されます。

SampleDataEvent.SAMPLE_DATAまたは素晴らしいstandningwave2libを使用して、動的に音楽を作成することに問題はありませんが、サウンドをコードと同期する方法を見つけることができません。

「同期」ノートがXミリ秒ごと(たとえば500)に再生されることを知っているので、サウンドを開始した直後に500ミリ秒ごとに刻むタイマーを開始しようとしましたが、最終的に同期が外れます。タイマーがパスをたどるのに十分ではないかどうかはわかりません

Adobe IDEフレームに音楽を配置し、サウンドを「ストリーム」として再生し、各フレームにコードを配置して、どこで呼び出されているかを知る方法があることは知っていますが、その方法で音楽を動的に作成することはできません。

それで、誰かが私の関数呼び出しを私が作成している音と同期させる方法を知っていますか?

4

4 に答える 4

3

これは、音楽の生成がいつ、どのように行われるかによると思います。ゲームを実行する前にその音楽を生成している場合、特定のトーンがその音楽に生成されたときにその音楽のタイム オフセット リストを作成し、それらの値から並べ替えられた配列を作成し、音楽がアクティブに開始されたときに生成できます。 、flash.utils.getTimer() 値を取得し、それを基準時間として保存します。この後、各フレームで、現在の getTimer() 値が現在の配列位置よりも大きいかどうかを確認します。そうであれば、必要な関数が呼び出され、配列内の位置を 1 つ進めて、次の事前設定された発生に備えます。お好みのトーンで。

一方、オンザフライで音楽を生成し、それぞれ数フレームの長さを生成する場合は、ゲームの開始時に getTimer() 値をロックし、(おそらく) 音楽生成をロックする必要があります。 sampleData に入力されるのは、再生された音楽の正確に 1/44100 秒です。次に、生成された音楽に目的のトーンを挿入する時間になるまで、それらのペアを (もちろんその場で) カウントします。その後、サウンドの開始からのオフセットが得られます。それをミリ秒に変換し、現在の getTimer() から格納されたティック カウントを差し引いた値が検出されたオフセット以上かどうかを各フレームで確認し、true の場合は関数を呼び出します。

于 2012-10-05T16:26:39.623 に答える
2

私が知っているように、再生中のサウンドは、動的に追加してもフレームと相関します。Event.ENTER_FRAME を使用してみてください。フレームレート (デフォルトでは 24 fps に等しい) と遅延 (X ミリ秒、「同期」ノートが再生されるとき) がわかっている場合、「同期」フレームのインデックスを取得できます: インデックス = fps * 遅延。サウンドとフレームの同期には公称 fps のみが重要であり、実際の fps ではないためです。Event.ENTER_FRAME ハンドラでフレームをカウントします。「同期」フレームを達成したら、コードを実行できます。

于 2012-10-06T00:46:59.820 に答える
1

SampleDataEvent.SAMPLE_DATA を処理する音楽をレンダリングするときに、音楽で何が起こるかについてメカニック コードに通知しないのはなぜですか? それはかなり正確でなければならず、複数のサウンド チャンク (通常、私が覚えている限りでは 2048 ~ 4096 の float ペアであり、2048/44100 - 4096/44100 ~= 1/22 - を意味します) の同期がずれることはありません。 1/11 秒)。また、これは確認していませんが、SAMPLE_DATA は既存のサウンド チャンクの再生が開始された直後に発火するので、準備が整ったら次のサウンド チャンクを使用できると思います。 render start を指定すると、実際のサウンドはその時点で正確に再生されるため (システムが過負荷でない場合)、ミリ秒単位まで非常に正確に計算できます。

于 2012-10-06T08:17:38.077 に答える
1

WAV で生成された音楽を FLV ストリーム内にカプセル化する必要があります (オーディオ タグのみを使用)。FLV オーディオ タグの間に FLV メタデータ タグを挿入します。これは、その部分が再生されているときにonMetaData を介して受け取ります。オンザフライで音楽を生成しているため、WAV ファイルを NetStream に渡すだけでなく、NetStream.appendBytes() を使用することもできます。

FLV の仕組み、appendBytes の仕組み、および WAV オーディオを含む FLV (ファイルに書き込むように appendBytes() に書き込む) の作成方法をよく理解する必要があります。

于 2012-10-07T19:49:53.513 に答える