【发布时间】:2012-02-22 03:37:26
【问题描述】:
我正在使用以下功能从麦克风录制音频输入:
private function handleSampleData(p_sampleEvent:SampleDataEvent) :void
{
var data :Number;
while (p_sampleEvent.data.bytesAvailable)
{
data = p_sampleEvent.data.readFloat();
_buffer.writeFloat(data);
_buffer.writeFloat(data);
}
}
这似乎有效。完成录制后,我将录制的数据复制到另一个缓冲区,如下所示:
_buffer.position = 0;
_lastRecord = new ByteArray();
while (_buffer.bytesAvailable)
{
_lastRecord.writeFloat(_buffer.readFloat());
}
_lastRecord.position = 0;
然后,我对新创建的声音使用 play() 并使用此函数将 _lastRecord 缓冲区提供给它:
public function handlePlaybackSampleData(p_sampleEvent:SampleDataEvent) :void
{
// Read data until either MAX_SAMPLES or all available samples are reached.
var i:int = 0;
var data :Number = 0;
while( i < 8192 )
{
if( _lastRecord.bytesAvailable )
{
data = _lastRecord.readFloat();
p_sampleEvent.data.writeFloat(data);
i++;
continue;
}
else
{
break;
}
}
}
虽然它基本上可以工作,但播放的声音太快了。 我从一个例子中提取了大部分代码,在这个例子中它工作得很好。我发现我的代码和这个代码之间没有更多重要的区别:http://labs.makemachine.net/2011/04/record-visualize-save-microphone-input/
不过,音频出来的太快了。如果我通过添加更多“_buffer.writeFloat(data);”将更多数据放入 _buffer,它会变得更好,当我有 12 行时,它就是所需的速度。但即使这样也只有当我碰到我的麦克风时才有帮助。如果我真的说话,那似乎也不够。
但是这是怎么回事呢?在我从中获取该代码的示例中,为什么只有 2 行就足够了?有没有办法确定我在录制时需要向缓冲区写入多少数据?
【问题讨论】:
标签: flash actionscript-3 audio audio-recording playback