1

现在我有这样的代码:

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

4

1 回答 1

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 官方捕获声音输入

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

参考关注文章。

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

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

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

我推荐以下网站。这篇文章是“如何调整播放率?” 很棒的教程。

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

于 2013-02-07T00:04:32.177 回答