我的程序需要播放视频,视频播放时,需要暂停背景音乐,结束或划出可视区域暂停需要恢复背景音乐。
[[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
用这个代码确实可行,但会卡住 UI 一下。
尝试了一些方法, StackOverflow 上也碰到一些人提过,但是都没解决方法
其中一个是将 UI 先改变完,再调用。让用户感知不到,但我的应用是个列表视频,用户很容易感知到。
另外一个是个写 xamarin 的哥们的解决方法,将调用放到异步线程执行,这个哥们说可以解决这个问题,并写了一篇博客,拜读后自己尝试用 OBJC 实现,但无论是哪种异步执行,都会卡住 UI 。
有没有大神能分享下自己的解决方案么? 先非常非常感谢一下!!!
自己折腾了一下,解决了。 Apple 文档有写
Set the session active or inactive. Note that activating an audio session is a synchronous (blocking) operation.
Therefore, we recommend that applications not activate their session from a thread where a long blocking operation will be problematic.
Note that this method will throw an exception in apps linked on or after iOS 8 if the session is set inactive while it has running or
paused I/O (e.g. audio queues, players, recorders, converters, remote I/Os, etc.
1
QingFengMingYue 2020-09-28 16:53:43 +08:00
楼主好!我遇到了和你一样的问题,参考 StackOverflow 我把这句话 setActive 放在后台线程,UI 还是会卡一下。想请教一下你当时是怎么解决的?
|
2
kera0a OP @QingFengMingYue
你这样试试看 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(1); [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:0 error:nil]; [[AVAudioSession sharedInstance] setActive:YES error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(1); [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil]; }); |