2011-12-13 75 views
1

我目前正在記錄和存儲聲音的ByteArray,然後播放它。但由於某些原因,ByteArray的播放起始位置是163840,而不是0,因爲我需要它。聲音字節數組的AS3播放不從開始

有沒有人有任何想法,爲什麼這可能會發生?

感謝,

馬克

var soundBA:ByteArray = new ByteArray(); 
var sound:Sound = new Sound(); 
var ch:SoundChannel = new SoundChannel(); 
var recordingsArray:Array = new Array(); 

//想象我已經成功地記錄並存儲在聲音進入recordingsArray

soundBA.clear(); 
soundBA.length = 0; 

//I collect the recorded byteArray within an array 
soundBA.writeBytes(recordingsArray[0]); 

soundBA.position = 0; 
trace("Start POS "+soundBA.position); //traces 0 

sound.addEventListener(SampleDataEvent.SAMPLE_DATA, sound_sampleDataHandler, false, 0, true); 
ch=sound.play(); 
this.addEventListener(Event.ENTER_FRAME, updateSeek, false, 0, true); 



public function updateSeek(event:Event):void { 

    trace("current Pos "+soundBA.position); //the first trace event is "current Pos 163840" 
} 



function sound_sampleDataHandler(event:SampleDataEvent):void { 

    for (var i:int = 0; i < 8192; i++) 
    { 
     if (soundBA.bytesAvailable < 4) 
     { 
      break; 
     } 
     var sample:Number = soundBA.readFloat(); 
     event.data.writeFloat(sample); 
     event.data.writeFloat(sample); 

    } 

} 

回答

3

這是因爲soundBA.position是字節數組位置,沒有位置的播放。由於聲音滯後,它在播放位置之前運行。要確定當前播放位置使用SoundChannel.position

public function updateSeek(event:Event):void { 
    trace("current pos in ms: " + ch.position); 
    trace("current pos in bytes: " + (ch.position * 44.1 * 4 * 2)); 
    trace("current pos in %: " + (100 * ch.position/sound.length)); 
} 

UPD:我是指這樣的情況:聲音是使用額外Sound對象解碼,例如:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.SampleDataEvent; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 

    public class SoundTest extends Sprite 
    { 
     private var soundSrc:Sound; 
     private var soundPlayer:Sound; 
     private var soundData:ByteArray; 
     private var soundChannel:SoundChannel; 

     public function SoundTest() 
     { 
      soundSrc = new Sound(); 
      soundSrc.addEventListener(Event.COMPLETE, startPlayback); 
      soundSrc.load(new URLRequest("sound.mp3")); 
     } 

     private function startPlayback(e:Event = null):void 
     { 
      soundData = new ByteArray(); 
      soundSrc.extract(soundData, soundSrc.length * 44.1, 0); 
      soundData.position = 0; 

      soundPlayer = new Sound(); 
      soundPlayer.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); 
      soundChannel = soundPlayer.play(); 
      addEventListener(Event.ENTER_FRAME, updateTime); 
     } 

     private function onSampleData(e:SampleDataEvent):void 
     { 
      for (var i:int = 0; i < 8192; i++) 
      { 
       if (soundData.bytesAvailable < 4) 
       { 
        break; 
       } 
       var sampleL:Number = soundData.readFloat(); 
       var sampleR:Number = soundData.readFloat(); 
       e.data.writeFloat(sampleL); 
       e.data.writeFloat(sampleR); 

      } 
     } 

     private function updateTime(e:Event):void 
     { 
      trace("current pos in ms: " + soundChannel.position); 
      trace("current pos in bytes: " + (soundChannel.position * 44.1 * 4 * 2)); 
      trace("current pos in % (method 1): " + (100 * soundChannel.position/soundSrc.length)); 
      // it also works 
      trace("current pos in % (method 2): " + (100 * soundChannel.position/(soundData.length/(44.1 * 4 * 2)))); 
     } 
    } 
} 
+0

輝煌!感謝回覆。只是一個小問題。 trace(「current pos in%:」+(100 * ch.position/sound.length)); 這似乎只運行到大約0.56。也就是說,如果我讓錄音完全播放,儘管它​​的長度結束%值總是在0.56左右。 當前位置百分比:0.5668934240362812 你知道這可能是爲什麼嗎? 謝謝 – crooksy88

+0

對不起,我誤解了你的問題。如何準備帶有聲音數據的字節數組?我指的是當你通過'Sound.extract()'方法獲得'ByteArray'時的情況。這是一種常用的技術:首先使用'Sound'對象('srcSound.load(...)')加載和解碼mp3文件,然後提取字節('srcSound.extract(soundBA,...)'),然後最後你用另一個(動態)聲音('dstSound.play()')播放提取的字節。在這種情況下,您可以獲得位置爲'100 * dstChannel.position/srcSound.length'。 – skozin

+0

如果你有'ByteArray'已經解碼的聲音,我假設你可以使用'encodedBA.length /(44.1 * 4 * 2)'獲得以毫秒爲單位的聲音長度(而不是sound.length)。 – skozin