AVFAudio在iOS 10上播放崩溃

17

我有一个带有基本音频组件的应用程序:使用AVAudioPlayer播放的一组循环背景歌曲(歌曲文件名存储为数组)。一切都运作良好已经好几个月了,但是iOS 10对我的大量用户(每天数千人)会出现崩溃。

问题是,我无法确定iOS 10发生了什么变化。似乎每次用户锁定设备时都会发生,并且特别是在音乐淡出完成后立即发生(它不执行后台音频,因此离开应用程序会自动淡出音乐)。

在那一刻,我每次都会得到以下信息:

2016-09-22 17:06:39.439979 TerraGenesis[8533:2459778] [aurioc] 889: failed: '!pla' (enable 2, outf< 2 ch,      0 Hz, Float32, non-inter> inf< 2 ch,      0 Hz, Float32, non-inter>)
2016-09-22 17:06:39.443348 TerraGenesis[8533:2459778] [aurioc] 889: failed: '!pla' (enable 2, outf< 2 ch,  44100 Hz, Float32, non-inter> inf< 2 ch,      0 Hz, Float32, non-inter>)
2016-09-22 17:06:39.445339 TerraGenesis[8533:2459778] [central] 54:   ERROR:    [0x1b50d6c40] >avae> AVAudioEngineGraph.mm:2515: PerformCommand: error 561015905
2016-09-22 17:06:39.446646 TerraGenesis[8533:2459778] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'error 561015905'
*** First throw call stack:
(0x1904781c0 0x18eeb055c 0x190478094 0x1a99d978c 0x1a99ed170 0x1a99ede58 0x1a9a5b3a0 0x1a9a5a6b0 0x1a9a5a640 0x1a0228580 0x1a020cff8 0x19041222c 0x190411930 0x1904116ac 0x190480b9c 0x190353bf4 0x190e5a6bc 0x1963284a0 0x19654df40 0x19655c3ec 0x196547ae8 0x19654776c 0x196879034 0x191febbd4 0x192019904 0x192019770 0x192019b18 0x190426278 0x190425bc0 0x1904237c0 0x190352048 0x191dd5198 0x19632b818 0x196326550 0x1001c1428 0x18f3345b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

这是堆栈跟踪:

Fatal Exception: com.apple.coreaudio.avfaudio
0  CoreFoundation                 0x18d45c1c0 __exceptionPreprocess
1  libobjc.A.dylib                0x18be9455c objc_exception_throw
2  CoreFoundation                 0x18d45c094 +[NSException raise:format:]
3  AVFAudio                       0x1a6a7578c AVAE_RaiseException(NSString*, ...)
4  AVFAudio                       0x1a6a89170 AVAudioEngineGraph::PerformCommand(AUGraphNode&, AVAudioEngineGraph::ENodeCommand, void*, unsigned int) const
5  AVFAudio                       0x1a6a89e58 AVAudioEngineGraph::Initialize()
6  AVFAudio                       0x1a6af73a0 AVAudioEngineImpl::Initialize()
7  AVFAudio                       0x1a6af66b0 AVAudioEngineImpl::Start(NSError**)
8  AVFAudio                       0x1a6af6640 -[AVAudioEngine startAndReturnError:]
9  SceneKit                       0x19d20c580 CPP3DAudioEngine::GetAVEngine()
10 SceneKit                       0x19d1f0ff8 -[SCNView _enterBackground:]

这里是我的代码。这是我代码中唯一处理音频的部分。

-(void)playNextSong {
    int musicPlaybackIndex = [[[NSUserDefaults standardUserDefaults] objectForKey:@"musicPlaybackIndex"] intValue];

    NSURL *soundFileURL = [NSURL fileURLWithPath:[_musicPlaylist objectAtIndex:musicPlaybackIndex]];
    _musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
    _musicPlayer.volume = 0.15;
    _musicPlayer.delegate = self;

    [_musicPlayer prepareToPlay];
    [_musicPlayer play];

    if(musicPlaybackIndex+1 < [_musicPlaylist count]) {
        musicPlaybackIndex++;
    } else {
        musicPlaybackIndex = 0;
    }
}

我在iPhone、iPad和iPod touch上看到了这个崩溃,但是只在iOS 10.0.0和10.0.1上看到。我已经搜索了几个小时关于"[aurioc]"的调用,但是找不到有用的信息,并且它使用了我无法理解的行话。

有人能否告诉我我可能做错了什么,或者帮助我指出AVAudioPlayer在iOS 10中可能发生了什么变化?

2个回答

8
这个代码为561015905的异常与AVAudioSessionErrorCodeCannotStartPlaying有关。如果应用程序的信息属性列表不允许音频使用,或者应用程序在后台并且使用不允许后台音频的类别,则可能会出现此错误类型。
请查看文档AVAudioSessionErrorCodeCannotStartPlaying。希望这可以帮到您。

很奇怪。显然,将“背景音频”功能添加到我的应用程序中修复了崩溃问题,即使我当时并没有在后台播放音频,现在也没有。不确定是什么原因导致iOS 10上出现了这个崩溃,但至少我有了解决方案。谢谢! - Nerrolken

7
这是一个苹果的bug,在等待iOS 10.2修复之前,有两种解决方法:
(1) (更糟糕的)启用背景音频
(2) (更好的)参见下面的苹果信息
苹果的信息:这是一个已知的问题,将在10.2中修复。 同时,另一种更简单的解决方法应该可以工作:在进入后台之前自己触发音频引擎的创建(例如设置时)。 您可以通过从SCNView获取音频引擎来触发此操作:
scnView.audioEngine;

2
谢谢!!!苹果拒绝了我的更新,因为我试图启用后台音频,但实际上并没有使用它,但只是调用 [_sceneView audioEngine] 似乎解决了这个问题。再次感谢! - Nerrolken
选项2似乎在运行SceneKit应用程序时停止(并防止)其他应用程序的后台音频播放 - 我尝试了一下,似乎解决了问题,但是我开始收到用户的投诉。目前为止,选项1似乎有效,并且不会停止其他后台音频(从我的测试中看)。 - stephent
我不明白scnView.audioEngine是什么意思? - OtakuFitness
重点是访问您的SCNView实例的audioEngine属性。我在SCNView子类的initWithFrame方法中执行以下代码:AVAudioEngine *audioEngine = self.audioEngine;但只有在iOS版本小于10.2.0时才需要这样做。 - user2860400
我写了 let audioEngine : AVAudioEngine = scnView.audioEngine,但是出现了另一个错误。"[0x16e0b3000] >avae> AVAudioIONodeImpl.mm:365: _GetHWFormat: required condition is false: hwFormat"。此外,audioEngine 从未被使用过。我该怎么处理 audioEngine? - OtakuFitness
我尝试执行 audioEngine.start(),日志告诉我首先在开始方法之前调用暂停或停止方法,然后我按照提示操作。在调用了 audioEngine.stop() 之后,它仍然崩溃,并且错误消息再次显示为 "[0x1b023bc40] >avae> AVAudioEngineGraph.mm:2515: PerformCommand: error -10851"。这是我的代码:let audioEngine : AVAudioEngine = scnView.audioEngine audioEngine.stop() do { try audioEngine.start() }catch let err as NSError{ print(err.localizedDescription) } - OtakuFitness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接