作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个 Flash 应用程序,它接收麦克风流并应用实时效果并将其输出回扬声器。
我发现我在从麦克风获取输出时遇到卡顿问题,将其复制到 ByteArray amd,然后使用单独的
sound = new Sound();
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
sound.play();
从这个 ByteArray 中读取并播放声音。
我注意到来自麦克风 bytesAvailable 的输入发生了变化,而且这两个事件(麦克风的 SAMPLE_DATA 和声音的 SAMPLE_DATA)没有像需要的那样触发 A B A B A B A B,而是更加随机。
我是否正确地认为 mic.SAMPLE_DATA 事件以不同的时间间隔触发,具有不同的数据量,并且有效的实现需要读取可用数据并缓冲输入,以便 Sound SampleDataEvent 始终可以播放返回以避免填充?
最佳答案
我找到了一个解决方案,所以我想我会把它贴在这里,以防其他人遇到类似的问题(许多谷歌搜索对我来说都没有结果)。
似乎麦克风的输入不一致,并且需要通过发送的所有字节才能正确处理声音。让它工作的关键是使用数组来缓冲输入。
private var mic:Microphone;
private var micBuffer:Array;
private var playBackSound:Sound;
//the effect I was applying needed to be applied to
private var _leftChannel:Vector.<Number> = new Vector.<Number>(8192/2);
private function init() {
micBuffer = new Array();
mic = Microphone.getMicrophone();
mic.rate = 22;
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleData);
}
private function micSampleData(e:SampleDataEvent) {
//store everything sent from the microphone into the array - this will vary in length
while (e.data.bytesAvailable > 0) micBuffer.push(e.data.readFloat());
//can wait here for the array to reach a certain size if needed
if (!playBackSound) {
playBackSound = new Sound();
playBackSound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
playBackSound.play();
}
}
private function playBackSoundSampleData(e:SampleDataEvent) {
//this number will change depending on the sample rate of microphone
var numberOfFloats = 8192/8;
for (var i = 0; i<numberOfFloats && micBuffer.length > 0; i++)
{
_leftChannel[i] = micBuffer.shift();
count++;
}
//apply effect
//sample rate here is half of 44 so write twice + twice again to make stereo
for(var i = 0 ; i < count ; ++i )
{
e.data.writeFloat( _leftChannel[i] );
e.data.writeFloat( _leftChannel[i] );
e.data.writeFloat( _leftChannel[i] );
e.data.writeFloat( _leftChannel[i] );
}
}
关于Flash 10.1 AS3 - 将实时效果应用于麦克风 - 卡顿问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4944351/
我是一名优秀的程序员,十分优秀!