在移动设备上进行第二次音频录制后未触发 SampleDataEvent

Posted

技术标签:

【中文标题】在移动设备上进行第二次音频录制后未触发 SampleDataEvent【英文标题】:SampleDataEvent not fired after second audio recording on mobile 【发布时间】: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 【参考方案1】:

似乎自从更新到 IOS 8 后就出现了这个问题。在 IOS 7 设备上,一切都很顺利。希望 adobe 或 apple 有修复

【讨论】:

以上是关于在移动设备上进行第二次音频录制后未触发 SampleDataEvent的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 3.5 deviceready 事件在 5 秒后未触发

iOS Facebook SDK 在设备上进行身份验证后未重定向

Javascript / HTML5 - 用于网络桌面/移动应用程序的音频流录制

科尔多瓦录制音频不起作用 Windows 10 移动版

Android 模拟器似乎以 96khz 录制音频

使用 AudioQueue 在 iOS 上进行失真(机器人)音频录制