6

さまざまなイベント (ボタンのホバー、クリックなど) で再生される非常に短い (1 秒未満の長さの) オーディオ クリップがいくつかあります。ただし、通常、アクションと実際のサウンド再生の間にはかなりのタイムラグがあります。サウンドを .swf に埋め込むことと、最初に外部からロードすることの両方を試みましたが、どちらも同じ結果になります。同様に、圧縮されたオーディオと圧縮されていないオーディオを試しました。

どうやら、オーディオ バッファが必要以上に長いようです。たとえば、Flash は、サウンドを開始する際の遅延を犠牲にして、途切れることなく長いサウンドを再生するように最適化されているようです。これでしょうか?それらを変更する方法はありますか?私が取り組んでいるものは、1 秒以上のサウンドを再生する必要はなく、開始時に常に完全にロードされるため、バッファーが非常に短くても問題はありません。

原因である可能性のあるもう 1 つのこと: loadSound() を使用するときに .wav ファイルを使用すると、実際にサウンドを再生することができません。エラーはなく、すべて正常に戻りますが、実際のサウンドは再生されません。そのため、現在 .mp3 として持っています。.mp3 オーディオ (または任意の圧縮オーディオ) を使用している場合、デコードに遅延が発生するのでしょうか? ただし、これについてまだ疑問を持っている理由は、それらを .wav ファイルとして (ライブラリにインポートすることによって) .swf に埋め込む場合でも、再生時に同じレイテンシーが発生するためです。

健全性チェックのために、無関係な部分とエラー チェックを除いて、取得したコードを含めます。まず、実行時にそれらをロードします。

var soundArray:Array = new Array();
loadSound( "click", "sounds/buttondroop4.mp3" );
loadSound( "hover", "sounds/Dink-Public_D-146.mp3" );

function loadSound( name:String, url:String ):void
{
   var req:URLRequest = new URLRequest( url );
   soundArray[ name ] = new Sound( req );
   soundArray[ name ].addEventListener( Event.COMPLETE, soundLoaded );
}
function soundLoaded( event:Event ):void
{
   for( var name:String in soundArray )
   {
      if( event.target == soundArray[name] )
      {
         trace( "Loaded sound [" + name + "]" );
         return;
      }
   }
}
function playSound( name:String ):void
{
   for( var nameSrc:String in soundArray )
   {
      if( name == nameSrc )
      {
         var channel:SoundChannel = soundArray[ name ].play();
         return;
      }
   }
}

// Sometime later, well after soundLoaded() callback is triggered...
playSound( "click" );
playSound( "hover" );

別の方法として、それらをクラスとしてライブラリに埋め込み、そこから移動します。

var sClick:soundClick = new soundClick();
var sHover:soundHover = new soundHover();
sClick.play();
sHover.play();

サウンド ファイルは小さく、通常は 10kb 未満です。ラグは明らかで、それを見たときに誰かが最初に不満を抱いたのは、ボタンホバーのサウンドエフェクトが遅れているように見えることだったので、うるさいのは私だけではありませんでした. 何か間違ったことをしているに違いないと感じています。この種のラグがほとんどなく、すばやいサウンドエフェクトを備えたフラッシュが多すぎます。

編集:サウンドファイル自体に関する最初の応答に応じて、私はすでにチェックしました.サウンドはファイルの先頭からすぐに始まります(サウンドの最初のミリ秒以外のすべてを切り取っても、それが作る「カチカチ」音)。

4

6 に答える 6

6

ちょっとしたことですが:

function playSound( name:String ):void
{
   for( var nameSrc:String in soundArray )
   {
      if( name == nameSrc )
      {
         var channel:SoundChannel = soundArray[ name ].play();
         return;
      }
   }
}

次のようにする必要があります。

function playSound(name:String):void
{
    if(soundArray[name])
    {
        soundArray[name].play();
    }
}

それがハッシュテーブルの目的であるため、ループルックアップの必要はありません。また、配列は整数を使用してインデックス付けされた順序付けられたセットであるため、配列をまったく使用しないでください。この場合、オブジェクト (または辞書) を使用して、soundMap という名前を付けます (サウンド名をサウンド オブジェクトにマップするため)。

音の遅延に関しては、何もないはずです。私は Flash でかなりの数のサウンドを作成してきました (大量の 1 回限りのロールオーバー サウンドとロールアウト サウンドを含む)。これが問題になったことは一度もありません。ただし、Flash Player 10 には、Adobe のエンジニアの 1 人がその記事で説明している新しい低レベルのサウンド APIがあります。それを含む解決策は少し大げさですが、おそらくミリ秒の精度を探しているでしょう。

fenomas からのアドバイスは賢明です。mp3 ファイルの最初と最後にデッドスペースがないかチェックし、できるだけ近くにトリミングしてください。また、イベント ハンドラから play ステートメントまでのパスは何ですか? そこに可能なブロックはありますか?mp3のフォーマットは何ですか?Flash は、特定のエンコーディング (44.1 hHz および 128 ビットだと思います) で最適に動作します。

于 2008-10-26T16:10:18.167 に答える
4

ええと、私の初歩的な答えは、私がこのようなことをしたとき、通常、サウンドファイルにはある程度のリードタイムが組み込まれていることに気付くということです。サウンドエディターでチェックインできますが、以前は、サウンドを Flash IDE にインポートし、空のムービー クリップを作成し、クリップのフレーム 1 にサウンドを配置するだけでした。次に、フレーム サウンドを編集すると、サウンド再生の開始点/終了点をドラッグするための素敵な小さなインターフェイスが表示されます。それから、クリップを取り付けたり取り外したりしてサウンドを再生したり、どこかに置いてフレーム コマンドを使用したりしていました。

リードタイムがオーディオではなくフラッシュであることがすでにわかっている場合は、キーアップではなくキーダウンでクリック音を再生するなどの合理的に明白なこと以外に、ヒントやコツはありません...

于 2008-10-23T02:55:27.513 に答える
3

私は同じ問題を抱えています。これに出くわしました。明らかに、サウンド プレーヤーをバックグラウンドで静かに「実行」し続ければ、小さな音のために「再起動」する必要はありません。まだ試していません...

http://www.ghostwire.com/blog/archives/as3-fixing-the-lag-that-arises-when-playing-a-short-sound-effect/

于 2009-08-25T13:13:00.120 に答える
2

解決策の 1 つは、サウンド ファイルをバイナリ データとして読み取る ActionScript ライブラリを使用することです。

StandingWave
https://github.com/maxl0rd/standingwave3
http://maxl0rd.github.com/standingwave3/

また、SWF の周囲の環境のオーディオ設定を確認してください。レイテンシーが Bluetooth ヘッドフォン接続に起因することに気付くまで、何時間もアプリをデバッグしていました。

于 2011-08-31T19:36:44.407 に答える
1

Flash Player 10.0.2.x で、サウンドのランセンシーが悪い (約 1 秒) ことがありました。サウンドチャンネルを停止したときのランテンシーは同じでした。

10.0.22.x にアップグレードしたところ、問題はなくなりました。

于 2009-07-19T00:58:23.303 に答える