我正在尝试播放“叮”声,提醒用户注意事件。 “Ding”播放但播放ding后,背景音频(在本例中为默认的Music.App)不会返回其原始音量。但是,关闭应用程序后它将恢复正常音量。这就是我所拥有的:
这是我设置音频会话类别的地方:
public override func viewDidLoad() {
super.viewDidLoad()
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: AVAudioSessionCategoryOptions.DuckOthers)
//refer to this link for swift's sound reference: https://developer.apple.com/ios/human-interface-guidelines/interaction/audio/
} catch {
print("unable to load audio session")
}
....
}
这就是我调用我的功能的地方:
if(!currentTimer.launchedNotification){
playFinishedSound()
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate)) //handles phone vibration
audioPlayerDidFinishPlaying(audioPlayer!, successfully: true)
}
这是我的私人职能:
private func playFinishedSound(){
if let pathResource = NSBundle.mainBundle().pathForResource("Ding", ofType: "wav"){
let soundToPlay = NSURL(fileURLWithPath: pathResource)
do {
audioPlayer = try AVAudioPlayer(contentsOfURL: soundToPlay)
if(audioPlayer!.prepareToPlay()){
print("preparation success")
audioPlayer!.delegate = self
setAVAudioSession()
if(audioPlayer!.play()){
print("Sound play success")
}else{
print("Sound file could not be played")
}
}else{
print("preparation failure")
}
}catch{
print("Sound file could not be found")
}
}else{
print("path not found")
}
}
这是我设置音频会话的地方:
private func setAVAudioSession() {
let session:AVAudioSession = AVAudioSession.sharedInstance()
do{
try session.setActive(true)
print("session is active")
}catch{
print("could not make session active")
}
}
这是AVAudioPlayerDelegate协议的委托方法:
public func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
do {
player.stop()
try AVAudioSession.sharedInstance().setActive(false, withOptions: AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation)
player.prepareToPlay()
print("Session stopped successfully")
}catch{
print("Could not end audio session")
}
}
同样,问题是如果在后台播放音乐,音乐音量将会变软,但是当音频会话处于非活动状态时,音乐音量将不会恢复正常。
答案 0 :(得分:0)
尝试过此方法后,我拥有的解决方案效果很好。唯一需要注意的是,如果您试图连续快速播放倒计时声音或其他声音,则延迟播放声音的设备,因此可能需要某种线程管理或其他方法来解决该问题。欢迎对此解决方案进行任何改进。
private let session = AVAudioSession.sharedInstance()
private func setSession(isActive: Bool) {
if isActive {
try! session.setCategory(AVAudioSession.Category.playback, options: AVAudioSession.CategoryOptions.duckOthers)
} else {
try! session.setCategory(AVAudioSession.Category.ambient, options: AVAudioSession.CategoryOptions.mixWithOthers)
}
try! self.session.setActive(isActive, options: .notifyOthersOnDeactivation)
}
当您要播放,暂停或停止音频时,请调用此方法。
将类别设置为playback
,将选项设置为duckOthers
可确保您播放的声音最大,而其他音频的音量则减小。
将类别设置为ambient
,将选项设置为mixWithOthers
可确保您的播放与其他音频类型相同,从而使音频增加到播放前的音量。 / p>
最后将音频状态设置为有效或无效(setActive
)
警告语:
当然不建议您使用try!
,而我已提供了此代码作为使您的工作顺利进行的方法。实施适用的最佳安全实践。