2013-02-06 196 views
1

Сapturing压缩流现在我有一个这样的代码:AS3:从麦克风

soundData = new ByteArray(); 
microphone = Microphone.getMicrophone(); 
microphone.codec = SoundCodec.SPEEX; 
microphone.rate = 8; 
microphone.gain = 100; 
microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler); 

function micSampleDataHandler(event:SampleDataEvent):void { 
    while (event.data.bytesAvailable) { 
    var sample:Number = event.data.readFloat(); 
    soundData.writeFloat(sample); 
    } 
} 

的原始数据被从话筒记录的。如何在使用SPEEX编解码器压缩之后将其转换为ByteArray?请注意,转换后的数据必须回放。

回答

2

引用此代码。

soundData.position=0; 

var soundOutput:Sound = new Sound(); 
soundOutput.addEventListener(SampleDataEvent.SAMPLE_DATA, playSound); 
soundOutput.play(); 

function playSound(soundOutput:SampleDataEvent):void { 
    if (! soundData.bytesAvailable>0) 
    { 
     return; 
    } 
    for (var i:int = 0; i < 8192; i++) 
    { 
     var sample:Number=0; 
     if (soundData.bytesAvailable>0) 
     { 
      sample=soundData.readFloat(); 
     } 
     soundOutput.data.writeFloat(sample); 
     soundOutput.data.writeFloat(sample); 
    } 
} 

使用SoundCodec.SPEEX上面的代码playrate不为1x你应该纠正playSound功能。也许你测试过了。如果你知道删除microphone.codec = SoundCodec.SPEEX;

更多信息Adobe Official Capturing sound input

有当记录在一个的Speex一些问题。

指一个follow artice。

http://forums.adobe.com/message/3571251#3571251

http://forums.adobe.com/message/3584747

如果SoundFormat指示的Speex,音频压缩单以16kHz采样。在闪光灯中,一个声音对象以44khz播放。由于您采样率为16khz(Speex),因此您通过SampleDataEvent事件处理程序2.75发送数据的速度比获取该数据的速度快。 因此,您必须更改playSound for(或while)循环。

我推荐以下网站。这篇文章是'如何进行调整?'很棒的教程。

http://www.kelvinluck.com/2008/11/first-steps-with-flash-10-audio-programming/