【发布时间】:2014-10-07 13:14:07
【问题描述】:
当我第二次从我的 ios 设备上的麦克风播放录制的音频时,我有一个奇怪的行为。
目标:
我想要实现的是一个应用程序,我们可以使用内置麦克风录制多个音频文件,还必须能够重新录制现有音频。
烦恼:
我第一次从麦克风录制音频并想在完成录制后播放它就像一个魅力。音频播放良好。
第二次我想用相同的 byteArray 或新的 byteArray 录制音频,并想播放录制的音频。 SampleDataEvent.SAMPLE_DATA 被触发了几次,但在 4-6 次后停止,然后没有。该应用程序不会崩溃,我没有收到任何错误。当我退出应用程序(按 iPad 上的主页按钮)然后再次打开应用程序时,音频开始播放。 SampleData 再次被触发,应用程序运行良好。但是在这里,如果我录制新音频,它也不会播放。退出应用,再次打开它就可以播放了。
录音代码(AudioRecord.as):
public function activate():void {
//
mic = Microphone.getMicrophone();
mic.setSilenceLevel(0);
mic.gain = 50;
mic.rate = 44;
}
public function startRecord():void {
trace("start audio record");
isRecording = true;
recordTime = 0;
//
soundBytes = null;
soundBytes = new ByteArray();
mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);
}
private function micSampleDataHandler(event:SampleDataEvent):void {
while (event.data.bytesAvailable) {
var sample:Number = event.data.readFloat();
soundBytes.writeFloat(sample);
}
}
播放音频代码(AudioBytesPlayer.as):
public function playSound(bytes:ByteArray):void {
trace("AudioBytesPlayer - startSound");
isPlaying = true;
soundData = bytes;
soundData.position = 0;
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playbackSampleHandler);
soundChannel.addEventListener(Event.SOUND_COMPLETE, onSC);
soundChannel = sound.play();
}
private function playbackSampleHandler(event:SampleDataEvent):void {
trace("playbackSampleHandler");
for (var i:int = 0; i < 8192; i++) {
if (soundData.bytesAvailable < 2) {
stopSound();
break;
}
var sample:Number = soundData.readFloat();
event.data.writeFloat(sample);
event.data.writeFloat(sample);
}
}
希望大家能帮帮我。
【问题讨论】:
-
代码很多;是否可以只发布可靠地产生错误的代码,以便更容易为您提供帮助?
-
我删除了一些代码,但重现错误的部分不清楚。我第一次录制和播放,一切正常。只有第二次播放导致没有触发 Event.SOUND_COMPLETE,并且 soundData.bytesAvailable 为 > 2
标签: ios actionscript-3 audio bytearray audio-recording