AS3:从麦克风捕获压缩流

时间:2013-02-06 20:20:21

标签: actionscript-3

现在我有一个这样的代码:

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?请注意,转换后的数据必须回放。

1 个答案:

答案 0 :(得分: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以上代码播放速度不是1x你应该纠正playSound功能。也许你测试过了。如果您删除microphone.codec = SoundCodec.SPEEX;知道。

更多信息Adobe Official Capturing sound input

在speex中录制时有一些问题。

参考以下的技巧。

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

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

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

我建议关注网站。这篇文章是'如何调整调整?'很棒的教程。

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