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

我有一个使用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播放录制的音频,在播放带有Web音频的音频后仍然可以正常工作。

对发生了什么的任何想法? 或者有关如何进一步调试的想法?


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

不幸的是,设置

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: nil]; 

在我的插件没有解决问题,所以我不得不在我的插件中使用AVPlayer实现播放功能,并确保插件初始化时设置了类别。

这些解决了我的问题。 感谢那个SO问题。

链接地址: http://www.djcxy.com/p/79035.html

上一篇: Web audio on ios conflicting with audio queue, only on device

下一篇: iOS Cannot play on speaker and set Audio Session to record