2009-03-30 5 views
1

オーディオのクリッピングを処理するためにFlash 10(9の古い問題と再生オフセットを克服するため)が必要なAS3プレーヤーがあります。しかし、再生する開始点と終了点を選択すると、再生されるものがAudacityで再生されるものと同じクリップと何度も一致しません。私のテストmp3(ffmpegの結果)に関するいくつかの詳細は以下の通りです。Flash 10でのアクションサウンドの再生精度

libavutil  49.10. 0/49.10. 0 
libavcodec 52. 0. 0/52. 0. 0 
libavformat 52.22. 1/52.22. 1 
libavdevice 52. 1. 0/52. 1. 0 
libswscale  0. 6. 1/0. 6. 1 
libpostproc 51. 2. 0/51. 2. 0 
built on Sep 24 2008 15:49:57, gcc: 4.2.4 (TDM-1 for MinGW) 
Input #0, mp3, from 'reagan_challenger.mp3': 
Duration: 00:00:14.62, start: 0.000000, bitrate: 127 kb/s 
Stream #0.0: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s 

オリジナルURL:http://ericmalone.net/test_media/reagan_challenger.mp3

クリップされたURL:http://ericmalone.net/test_media/reagan_clipped.wav

クリップが4017msからクリップを取得するためにffmpegのを使用してバックエンドで作成されました - 7400ms:

ffmpeg -i reagan_challenger.mp3 -ss 4.017 -t 3.383 reagan_clipped.wav 

私がしましたAudacityを使用してファイルを少し小さく正確な位置にクリップしました。4.017676秒 - 7.401333秒(http://ericmalone.net/test_media/reagan_challenger_from_audacity.wav

ここでフラッシュ再生にhttp://ericmalone.net/test_media/SoundExample.swf

お知らせ単語その挑戦者完了の下に表示されるコードを経由して再生するクリッピング部分は、ですが、Audacityはとffmpegのベースの切り抜きの両方に切り捨てられます。

フラッシュでオーディオ再生を停止する方法はかなり標準的です。私はサウンドクラスをテストクラスに抽出しました。ここでは、関連するコード

package { 
    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 
    import flash.utils.Timer; 

    public class SoundExample extends Sprite { 
     private var url:String = "http://www.ericmalone.net/test_media/reagan_challenger.mp3"; 
     private var soundFactory:Sound; 
     private var song:SoundChannel; 

     private var clipStart:int = 4017; 
     private var clipEnd:int = 7400; 

     private var timer:Timer; 
     private var timerInterval:uint = 20; 

     private var textField:TextField; 

     public function SoundExample() { 
      var request:URLRequest = new URLRequest(url); 
      soundFactory = new Sound(); 
      soundFactory.addEventListener(Event.COMPLETE, completeHandler); 
      soundFactory.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
      soundFactory.load(request); 

      textField = new TextField(); 
      textField.wordWrap = true; 
      textField.width = 500; 
      addChild(textField); 
     } 

     private function completeHandler(event:Event):void { 
      output("file completely loaded and playing"); 
      timer = new Timer(timerInterval); 
      timer.addEventListener(TimerEvent.TIMER, onTimer); 
      song = soundFactory.play(clipStart); 
      timer.start(); 
     } 

     private function ioErrorHandler(event:Event):void { 
      output("ioErrorHandler: " + event); 
     } 

     private function onTimer(event:TimerEvent):void 
     { 
      //stop playback if position is greater than clip end 
      //or if there's less duration left than difference of the timer and current position 
      if((song.position >= clipEnd || clipEnd - song.position < timerInterval)) 
      { 
       timer.stop(); 
       song.stop(); 
       output("Ending playback at " + song.position + " to be as close to " + clipEnd + " as possible"); 

      } 
     } 

     private function output(str):void 
     { 
      textField.text = str; 
      trace(str); 
     } 
    } 
} 

がそこで質問がされます、フラッシュの中から、より正確な再生を得るための良い方法はありますか?コーデック/サンプリングレート/などに依存しますか?

答えて

2

直接あなたはTimerクラスは、特定の精度マージンを持って認識しなければならない適切なmp3エンコーディングに関するしかし助けることができる...

ありません。

あなたの例でのテストは、私にとっては良い(中央ではクリックしない)と聞こえて、私はかなり受け入れられているIMOの望ましい結果の近くに0.2%来ました。

  • タイマーが20msの時に実行されます。

    clipEnd - song.position < timerInterval

    次のシナリオを想像:私はあなたの例から、次の条件を考えると、上でピックアップしたかったディテールがありますコードについて

    0から7400までの間の間隔

  • 次の最後のティックは、7381に1ms前進します。
  • 条件がそれをキャンセルしていなかった場合、私はそれが7401(100.01パーセント)で停止しているだろうと思い99.74パーセント

で停止しますND

たぶん、あなたは(ブラインドがコード化され、注意してください)のようなものを試してみてください。

if(song.position >= clipEnd || (clipEnd - song.position < (song.position + timerInterval) - clipEnd)) 
{ 
    // Stop Timer 
} 

遅延は実行するコード、コンピュータなどによって異なります。最高の「均等性」に近づけるために、異なる間隔値を持つ遊びをすることをお勧めします。

また、timerイベントの実行を遅延させるその他の方法がないことを確認してください。 これを行うには、このタイマー部分をベンチマークする(サウンドを削除する)ために、おそらくこのタイマー部分を分離する必要があります。

+0

タイマーは実際にはあまり問題にはなりません。 swfの例を聞いてみると、レーガンが「挑戦者」という言葉を完成させたと聞こえます。通常、再生は約7407msで終了します。しかし、mp3をffmpegまたはAudacityで最大7400(上のリンク)までクリップすると、その単語のかなりの部分が途切れてしまいます。 – er1234