AudioQueueStart 返回 561015905 (AVAudioSessionErrorCodeCannotStartPlaying)

Posted

技术标签:

【中文标题】AudioQueueStart 返回 561015905 (AVAudioSessionErrorCodeCannotStartPlaying)【英文标题】:AudioQueueStart returns 561015905 (AVAudioSessionErrorCodeCannotStartPlaying) 【发布时间】:2016-01-14 12:16:57 【问题描述】:

我的应用使用音频队列服务来播放声音。在应用启动时,我将音频会话类别设置为独奏环境:

`[[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 等)。”

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

【问题讨论】:

好吧,[AudioQueueStart API](developer.apple.com/library/mac/documentation/MusicAudio/…) 的 Apple 文档声明它“开始播放或录制音频”,所以也许你不应该打这个电话。您是否需要 OSStatus 来做其他事情?此外,该方法的第二个参数是 AudioTimeStamp 类型,因此它可能需要 NULL 或实际结构,而不是 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 设置,这段代码播放循环旋律,只在前台,如果你转到后台,播放器会停止。

如果你这样做:

旋律将继续在后台播放,在我的情况下,我可以在需要时停止并在后台和前台播放旋律。然后我添加系统声音来调用然后你停止播放器,系统声音停止然后你继续播放音乐。

-(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);
    

希望对解决你的问题有所帮助,有问题,我会一一解答。

【讨论】:

以上是关于AudioQueueStart 返回 561015905 (AVAudioSessionErrorCodeCannotStartPlaying)的主要内容,如果未能解决你的问题,请参考以下文章

AudioQueueStart 返回 561015905 (AVAudioSessionErrorCodeCannotStartPlaying)

AudioQueueStart() 方法无法在 ios4 后台播放音乐

在 iphone4 中打电话后 AudioQueueStart 失败

iPad 上的 AudioQueueStart() 问题

使用 AudioQueueStart() 时的延迟

AudioQueueStart 在 iOS 7 的后台进程中失败并显示 -16981