现在我有一个这样的代码:
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?请注意,转换后的数据必须回放。
答案 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/