音频队列启动失败

时间:2010-03-22 08:29:57

标签: iphone

我正在开发一个既有音频流也有从文件播放音频的项目。对于音频流我正在使用AudioStreamer并从文件播放我正在使用avaudioplayer。 只要应用程序不被电话或短信中断,流媒体和播放都可以正常工作。但是当我尝试重新启动流式传输时解除呼叫后出现呼叫/短信时,我收到错误“音频队列启动失败”。只有当我使用avaudioplayer至少一次并且之后使用流式传输时才会发生这种情况。如果未创建avaudioplayer对象,则在此方案中,在解除呼叫后恢复流式传输没有问题。我的猜测是,audioqueue有些问题。

非常感谢帮助。

更新

我目前使用的代码如下所示

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) {

    // This callback, being outside the implementation block, needs a reference 
    //to the AudioPlayer object
    AudioStreamer *player = (AudioStreamer *)[streamerArray objectAtIndex:0];

    if (interruptionState == kAudioSessionBeginInterruption) {
        NSLog(@"kAudioSessionBeginInterruption 1");

            [player pause];
            interruptedOnPlayback = YES;


    }       else if (interruptionState == kAudioSessionEndInterruption) {
            NSLog(@"kAudioSessionEndInterruption 2");
              AudioSessionSetActive( true );


        [player start];
        interruptedOnPlayback = NO;

    }
}

你可以看到我正在使用AudioSessionSetActive(true),只要没有创建avaudioplayer对象,它就可以正常工作。只有当我在创建Avaudioplayer对象后使用流光并且应用程序被电话中断时,才会出现此问题 或短信我收到错误音频队列启动失败?!

2 个答案:

答案 0 :(得分:2)

我有同样的问题,更详细的错误信息是“hwiu”(硬件在使用中)或1752656245.但我在启动audioStreamer之前使用MPMoviePlayerController。 我只需要在MPMoviePlayerController方法中释放它之前停止moviePlayBackDidFinish([moviePlayer stop])。 停止应释放一些硬件组件。

我希望它有所帮助

答案 1 :(得分:0)

您需要在中断后自行激活音频会话。

我不知道AVAudioPlayer,但如果你直接使用音频队列服务,你可能会有这样的东西作为你的中断处理程序:

void interruptionListener(void * inClientData, UInt32 inInterruptionState) {
  if (inInterruptionState == kAudioSessionEndInterruption) {
    OSStatus rc = AudioSessionSetActive(true);
    if (rc) {
      NSLog(@"AudioSessionSetActive(true) returned %d", rc);
    }
  }
}

并将其传递给您的AudioSessionInitialize()调用。

您也可以懒惰地重启会话:

-(void)startPlaying {
  OSStatus rc = AudioQueueStart(queue, NULL);
  if (rc) {
    NSLog(@"startPlaying AudioQueueStart returned %d.", rc);

    if (rc == kAudioSessionNotActiveError) {
      rc = AudioSessionSetActive(true);
      if (rc) {
        NSLog(@"startPlaying - AudioSessionSetActive(true) returned %.d", rc);
      } else {
        NSLog(@"startPlaying - restarted Audio Session");
      }
    }
  }
}