我正在做一个项目,用户必须录制他/她的声音,并将其提交到服务器。但在提交之前,用户可能需要播放录制的声音。
该应用程序具有使用 SPEEX 编解码器 进行录制和播放的功能。但我发现了什么 奇怪和困难的是,当我播放录制的音频时,播放速度比正常情况更快或更慢,无法理解。就好像它的快进一样。
示例代码如下:
private var mic:Microphone;
private var rec:ByteArray;
private var snd:Sound;
private var channel:SoundChannel;
protected function recBtn_clickHandler(event:MouseEvent):void
{
rec = new ByteArray();
mic = Microphone.getMicrophone();
mic.setLoopBack(false);
mic.setUseEchoSuppression(true);
mic.gain = 50;
mic.setSilenceLevel(5, 1000);
mic.codec = SoundCodec.SPEEX;
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, getMicAudio);
}
protected function plyBtn_clickHandler(event:MouseEvent):void
{
snd.addEventListener(SampleDataEvent.SAMPLE_DATA, playRecorded);
channel = snd.play();
}
private function getMicAudio(e:SampleDataEvent): void
{
rec.writeBytes(e.data);
}
private function playRecorded(e:SampleDataEvent): void
{
if (!rec.bytesAvailable > 0) return;
for (var i:int = 0; i < 2048; i++){
var sample:Number = 0;
if (rec.bytesAvailable > 0) sample = rec.readFloat();
for (var j:uint = 0; j < 6; j++) {
e.data.writeFloat(sample);
}
}
}
这种情况只发生在:
- mic.codec = SoundCodec.SPEEX;
- mic.rate = 16
我浏览了很多论坛,但找不到使用 SPEEX 编解码器或 microphone.rate = 16 的麦克风播放的任何解决方案;
最佳答案
在 Flash 中,声音对象以 44khz 的频率播放。由于您以 16khz 采样,因此您通过 SampleDataEvent 事件处理程序发送数据的速度比获取数据快 2.75 倍。
也就是说,如果您要发送两次。
但是您实际上是在尝试通过比录制内容快 3 倍的速度来解决这个问题。这仍然不是最佳的,你会得到一个放慢版本的录音,只是一点点,因为你现在正在发送数据,就好像它是以 48 khz 记录的,但你发送的是 44khz。
你只能做两件事,我想你已经在做了。
要么调整你在 for 循环中每次迭代执行的写入次数。或将最大增量(2048)调整为更高的数字,但我相信它不能超过 8192。
我用speex录音的时候遇到了同样的问题。
关于apache-flex - 在 Flex 中使用 SPEEX 编解码器进行麦克风播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5472659/