ios上的Web音频与音频队列冲突,仅在设备上冲突

时间:2014-07-28 11:41:59

标签: ios cordova core-audio web-audio

我有一个使用CoreAudio录制音频的Cordova插件。它处理音频样本,并且还使用CoreAudio重放录制的音频。该应用程序还使用网络音频播放一些音频。

在ios模拟器中一切运行良好,但在设备上,问题如下:记录/重放效果很好,直到对Web音频进行一次调用,在这种情况下,对CoreAudio的一次后续调用失败。

如果我重新使用AudioQueue,并尝试在停止后重新启动它(以及使用网络音频播放一些音频后),对AudioQueueStart的调用将返回560034163,这是"!aqs"。我找不到那意味着什么。

for (i = 0; i < kNumberBuffers; ++i) {
    XThrowIfError(AudioQueueEnqueueBuffer(audioQueue, audioBuffers[i], 0, NULL),
          "AudioQueueEnqueueBuffer failed");
  }
// That returns !aqs
XThrowIfError(AudioQueueStart(audioQueue, NULL), "AudioQueueStart failed");

或者如果我在录制停止时丢弃队列,那么如果我重新启动创建一个新队列,对AudioQueueStart的调用将返回-50,我读到这意味着某些参数无效。只有参数才是显然已成功创建的队列。同样,只有在我播放网络音频时才会出现此错误。

XThrowIfError(AudioQueueNewInput(&recordFormat, RecordingCallback,
              this /* userData */, NULL /* run loop */, NULL /* run loop mode */,
              0 /* flags */, &audioQueue), "AudioQueueNewInput failed");

  int bufferByteSize = 2 * 1024;
  int i;
  for (i = 0; i < kNumberBuffers; ++i) {
    XThrowIfError(AudioQueueAllocateBuffer(audioQueue, bufferByteSize, audioBuffers[i]),
                  "AudioQueueAllocateBuffer failed");
    XThrowIfError(AudioQueueEnqueueBuffer(audioQueue, audioBuffers[i], 0, NULL),
                  "AudioQueueEnqueueBuffer failed");
  }
  XThrowIfError(AudioQueueStart(audioQueue, NULL), "AudioQueueStart failed");

正如我所说的,除非我在设备上以及在使用网络音频播放音频后,所有这些都能正常工作。此外,在播放带有网络音频的音频后,使用另一个AudioQueue播放录制的音频仍可正常播放。

知道发生了什么事吗?或者关于如何进一步调试的任何想法?

1 个答案:

答案 0 :(得分:1)

问题似乎是音频会话类别需要在AVAudioSessionCategoryPlayAndRecord和AVPlayer(这可能是内部用于使用媒体插件或网络音频API从URL播放音频)。显然有AVAudioPlayer,没有这样的问题,但我需要在网上播放文件。

不幸的是,设置

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: nil]; 
我的插件中的

没有解决问题,因此我必须使用AVPlayer在我的插件中实现回放功能,并确保在初始化插件时设置类别。

这些解决了我的问题。感谢that SO issue