AudioQueueStart返回561015905(AVAudioSessionErrorCodeCannotStartPlaying)

时间:2016-01-14 12:16:57

标签: ios objective-c audio audioqueue

我的应用使用音频队列服务播放声音。在应用程序启动时,我将音频会话类别设置为solo ambient:

`[[AVAudioSession sharedInstance] setCategory:AVAudioSEssionCategorySoloAmbient error:&error];`

当我的应用代表获得applicationWillResignActive通知时,我会拨打AudioQueuePause(queue);来播放所有播放的声音。当应用代表获得applicationDidBecomeActive时,我会调用

OSStatus status = AudioQueueStart(queue, 0);

有时(并且很难重现)status等于561015905.此值不属于Audio Queue Result Codes。它是AVAudioSessionErrorCodeCannotStartPlaying,文档说

  

"应用程序不允许开始录制和/或播放,通常是因为Info.plist中缺少音频键。这也可以   如果应用程序具有此密钥但使用无法记录的类别,则会发生         和/或在后台播放(AVAudioSessionCategoryAmbient,   AVAudioSessionCategorySoloAmbient等。)"

我绝对不想在后台播放声音(这就是为什么我在app停止活动时暂停音频队列的原因)。那么,我做错了什么?

1 个答案:

答案 0 :(得分:1)

我有一个类似的问题,但我以不同的方式做了一点......有音乐应用程序需要背景音乐,但在某些条件下,她必须在背景模式下嚎叫。 对我来说,我使用这段代码:

#import "ViewController.h"
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVAudioPlayer.h>
#import <AVFoundation/AVAudioSession.h>

@interface ViewController ()
{
  AVAudioPlayer *audioPlayer;
}

@property (assign) SystemSoundID pewPewSound;

@end

@implementation ViewController

- (void)viewDidLoad 
{
  [super viewDidLoad];

  NSURL * pewPewURL = [[NSBundle mainBundle]URLForResource:@"Calypso" withExtension:@"caf"];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:pewPewURL error:nil];

     if (audioPlayer)
     {
          [audioPlayer setNumberOfLoops:100];
          [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
          [[AVAudioSession sharedInstance] setActive: YES error: nil];
          [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
          [audioPlayer prepareToPlay];
          [audioPlayer play];
     }

}

@end

如果您不接触任何Xcode设置,此代码仅播放前景中的循环旋律,如果您转到后台,播放器将停止播放。

如果你这样做:

enter image description here

旋律将继续在后台播放,在我的情况下,我可以在我想要的时候在背景和前景中停止和播放旋律。然后我添加系统声音然后停止播放器,系统声音停止然后U继续播放音乐。

-(void)stopPlaying
{
    [audioPlayer pause];

    NSURL * pewPewURL;
    pewPewURL = [[NSBundle mainBundle]URLForResource:@"Calypso" withExtension:@"caf"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)pewPewURL, &_pewPewSound);
    AudioServicesPlaySystemSound(self.pewPewSound);
}

-(void)continueToPlay
{
    if ([audioPlayer prepareToPlay])
    {
        [audioPlayer play];
        AudioServicesRemoveSystemSoundCompletion(self.pewPewSound);
        AudioServicesDisposeSystemSoundID(self.pewPewSound);
    }
}

我希望它有助于解决你的问题,如果有问题,我会回答所有问题。