Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios:在主线程外播放声音_Ios_Multithreading_Audio - Fatal编程技术网

ios:在主线程外播放声音

ios:在主线程外播放声音,ios,multithreading,audio,Ios,Multithreading,Audio,我制作了一个简单的应用程序,当超过一定的噪音水平时,它会发出警报。因此,我有一个AudioQueue,它记录声音并测量所记录声音的音量(仅重要的代码部分如下所示): 实际上,代码工作正常,因此代码中应该没有错误,而且wave文件的格式也正确。事情就是这样的: iPhone模拟器: 一切正常。创建对象SoundPlayer时,构造函数中对[self playSound]的调用会导致模拟器播放随机声音,从而证明该方法正确实现。然后我开始录音,当超过某个声级时,就会从AudioRecorder(在一个

我制作了一个简单的应用程序,当超过一定的噪音水平时,它会发出警报。因此,我有一个AudioQueue,它记录声音并测量所记录声音的音量(仅重要的代码部分如下所示):

实际上,代码工作正常,因此代码中应该没有错误,而且wave文件的格式也正确。事情就是这样的:

  • iPhone模拟器: 一切正常。创建对象SoundPlayer时,构造函数中对[self playSound]的调用会导致模拟器播放随机声音,从而证明该方法正确实现。然后我开始录音,当超过某个声级时,就会从AudioRecorder(在一个单独的线程中)调用该方法,并播放声音。这就是我们想要的行为

  • 实际iPhone设备: 创建对象SoundPlayer时,会播放随机声音,因此效果良好。但当我开始录音,并且超过了噪音级别时,AudioRecorder会调用Soundplayer中的playSound方法,但不会播放声音。我怀疑这是因为这发生在一个分离的线程中。但我不知道如何修复


  • 我已经尝试通过使用默认通知中心的通知来修复它,但它也不起作用。我如何管理声音的播放?

    需要考虑以下几点:

    1) 确保启用播放和录制:

    UInt32 category = kAudioSessionCategory_PlayAndRecord;
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
                            sizeof(category), &category);
    
    2) 检查
    -(void)playSound
    中各种
    音频服务*
    调用的返回值,查看其实际故障位置

    3) 确保类AudioRecorder中的
    sp
    属性已正确初始化(即调用AudioRecorder的正确init方法)

    4) (某些)iOS设备可能不支持同步录制和播放的不同采样率。如果您的.wav文件的采样率与录制音频队列的采样率不同,则值得尝试调整其中任何一种

    5) 不要调用
    [sp playSound]
    而是使用以下语句在主线程上调用它:

    [sp performSelectorOnMainThread:@selector(playSound) withObject:nil waitUntilDone:NO];
    
    另外请注意,最有可能的情况是,您的警报声会在录音中听到(尽管iPhone4可以过滤掉)

    UInt32 category = kAudioSessionCategory_PlayAndRecord;
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
                            sizeof(category), &category);
    
    [sp performSelectorOnMainThread:@selector(playSound) withObject:nil waitUntilDone:NO];