Flash AS3话筒录音/保存功能,闪存PCM播放速度加倍

Flash AS3话筒录音/保存功能,闪存PCM播放速度加倍,flash,actionscript-3,wav,audio-recording,audio-player,Flash,Actionscript 3,Wav,Audio Recording,Audio Player,我在AS3中有一个可以工作的麦克风录制脚本,我能够成功地使用它通过AMF将.wav文件保存到服务器。这些文件在任何音频播放器中都可以正常播放,没有任何奇怪的效果 作为参考,以下是我如何捕捉麦克风的字节:(在一个名为AudioRecorder的类中) 这是没有问题的。录制完成后,我可以获取_rawData变量并通过WavWriter类运行它,等等 但是,如果我使用以下代码运行与声音相同的ByteArray,这些代码是我从adobe cookbook中改编的:(在一个名为WavPlayer的类中)

我在AS3中有一个可以工作的麦克风录制脚本,我能够成功地使用它通过AMF将.wav文件保存到服务器。这些文件在任何音频播放器中都可以正常播放,没有任何奇怪的效果

作为参考,以下是我如何捕捉麦克风的字节:(在一个名为AudioRecorder的类中)

这是没有问题的。录制完成后,我可以获取_rawData变量并通过WavWriter类运行它,等等

但是,如果我使用以下代码运行与声音相同的ByteArray,这些代码是我从adobe cookbook中改编的:(在一个名为WavPlayer的类中)

公共函数播放声音(数据:ByteArray):无效{
_wavData=数据;
_wavData.position=0;
_sound.addEventListener(SampleDataEvent.SAMPLE_数据,_playSoundHandler);
_频道=_sound.play();
_渠道
.addEventListener(Event.SOUND\u COMPLETE,\u onPlaybackComplete,false,0,true);
}
私有函数playSoundHandler(e:SampleDataEvent):void{
if(_wavData.bytesAvailable 0)sample=_wavData.readFloat();
e、 data.writeFloat(样本);
}
}
音频文件以双倍速度播放!我检查了记录的比特率,我确信这些都是正确的,我试着改变缓冲区大小和我能想到的任何其他数字。这会是单声道还是立体声


希望我在这里说得够清楚,谢谢

问题在于ByteArray必须包含两个通道(左通道和右通道)的数据,一个值紧跟另一个值。因此,如果您的录音是单声道的,您的代码应该是:

for(var i:int = 0; i < 8192; i++) {
    var sample:Number = 0;
    if(_wavData.bytesAvailable > 0) sample = _wavData.readFloat();
        e.data.writeFloat(sample);
        e.data.writeFloat(sample);
}
for(变量i:int=0;i<8192;i++){
var样本:数量=0;
如果(_wavData.bytesavable>0)样本=_wavData.readFloat();
e、 data.writeFloat(样本);
e、 data.writeFloat(样本);
}
如果是立体声,您需要进行相应调整。

我已经测试过了。
您需要确保麦克风的频率为44kHz:
_麦克风频率=44
这听起来应该是对的。

我使用:

    private function playSound(data:ByteArray):void
    {
        rawData = data;
        rawData.position = 0;
        var sound:Sound = new Sound();
        sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playSoundHandler);
        var channel:SoundChannel = sound.play();
        channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete, false, 0, true);
    }

    private function playSoundHandler(e:SampleDataEvent):void
    {
        if(rawData.bytesAvailable <= 0)
        {
            return;
        }
        for(var i:int = 0; i < 8192; i++)
        {
            var sample:Number = 0;
            if(rawData.bytesAvailable > 0)
            {
                sample = rawData.readFloat();
            }
            e.data.writeFloat(sample);
            e.data.writeFloat(sample);
        }
    }
专用函数播放声音(数据:ByteArray):无效
{
原始数据=数据;
rawData.position=0;
变量声音:声音=新声音();
sound.addEventListener(SampleDataEvent.SAMPLE_数据,playSoundHandler);
var channel:SoundChannel=sound.play();
channel.addEventListener(Event.SOUND_COMPLETE、onPlaybackComplete、false、0、true);
}
私有函数playSoundHandler(e:SampleDataEvent):void
{
if(rawData.bytes可用0)
{
sample=rawData.readFloat();
}
e、 data.writeFloat(样本);
e、 data.writeFloat(样本);
}
}

所以它是立体声/单声道的东西!我没想过要写两次,谢谢!对于AS3问题,您应该坚持使用“actionscript-3”标签。这是常用的。
for(var i:int = 0; i < 8192; i++) {
    var sample:Number = 0;
    if(_wavData.bytesAvailable > 0) sample = _wavData.readFloat();
        e.data.writeFloat(sample);
        e.data.writeFloat(sample);
}
    private function playSound(data:ByteArray):void
    {
        rawData = data;
        rawData.position = 0;
        var sound:Sound = new Sound();
        sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playSoundHandler);
        var channel:SoundChannel = sound.play();
        channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete, false, 0, true);
    }

    private function playSoundHandler(e:SampleDataEvent):void
    {
        if(rawData.bytesAvailable <= 0)
        {
            return;
        }
        for(var i:int = 0; i < 8192; i++)
        {
            var sample:Number = 0;
            if(rawData.bytesAvailable > 0)
            {
                sample = rawData.readFloat();
            }
            e.data.writeFloat(sample);
            e.data.writeFloat(sample);
        }
    }