2017-10-21 80 views
2

我想在应用程序未对焦时允许背景音频。我目前有这样的代码,它应该允许:允许Swift无法使用背景音频

do { 
    try AKSettings.setSession(category: .playback, with: .mixWithOthers) 
} catch { 
    print("error") 
} 
AKSettings.playbackWhileMuted = true 

我还在功能设置中启用了“音频,Airplay和画中画”设置。但是,当我按下设备上的主页按钮时,音频不会继续播放。我究竟做错了什么?如果有问题,我正在使用AudioKit来产生声音。

我正在使用一个单例来容纳我命名为AudioPlayer.swift的所有AudioKit组件。以下是我在我的AudioPlayer.swift单文件:

class AudioPlayer: NSObject { 
    var currentFrequency = String() 
    var soundIsPlaying = false 

    var leftOscillator = AKOscillator() 
    var rightOscillator = AKOscillator() 

    var rain = try! AKAudioFile() 
    var rainPlayer: AKAudioPlayer! 

    var envelope = AKAmplitudeEnvelope() 

    override init() { 
     super.init() 

     do { 
      try AKSettings.setSession(category: .playback, with: .mixWithOthers) 
     } catch { 
      print("error") 
     } 
     AKSettings.playbackWhileMuted = true 

     AudioKit.output = envelope 
     AudioKit.start() 
    } 

    func setupFrequency(left: AKOscillator, right: AKOscillator, frequency: String) { 
     currentFrequency = frequency 

     leftOscillator = left 
     rightOscillator = right 

     let leftPanner = AKPanner(leftOscillator) 
     leftPanner.pan = -1 

     let rightPanner = AKPanner(rightOscillator) 
     rightPanner.pan = 1 

     //Set up rain and rainPlayer 
     do { 
      rain = try AKAudioFile(readFileName: "rain.wav") 
      rainPlayer = try AKAudioPlayer(file: rain, looping: true, deferBuffering: false, completionHandler: nil) 
     } catch { print(error) } 

     let mixer = AKMixer(leftPanner, rightPanner, rainPlayer) 

     //Put mixer in sound envelope 
     envelope = AKAmplitudeEnvelope(mixer) 
     envelope.attackDuration = 2.0 
     envelope.decayDuration = 0 
     envelope.sustainLevel = 1 
     envelope.releaseDuration = 0.2 

     //Start AudioKit stuff 
     AudioKit.output = envelope 
     AudioKit.start() 
     leftOscillator.start() 
     rightOscillator.start() 
     rainPlayer.start() 
     envelope.start() 
     soundIsPlaying = true 
    } 
} 

这里是我的声音效果视图控制器,它引用AudioKit单将其发送一定频率的一个示例(我有一个关于这些视图控制器的十几个,每个都有自己的频率设置):

class CalmView: UIViewController { 
    let leftOscillator = AKOscillator() 
    let rightOscillator = AKOscillator() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     leftOscillator.amplitude = 0.3 
     leftOscillator.frequency = 220 

     rightOscillator.amplitude = 0.3 
     rightOscillator.frequency = 230 
    } 

    @IBAction func playSound(_ sender: Any) { 
     if shared.soundIsPlaying == false { 
      AudioKit.stop() 
      shared.setupFrequency(left: leftOscillator, right: rightOscillator, frequency: "Calm") 
     } else if shared.soundIsPlaying == true && shared.currentFrequency != "Calm" { 
      AudioKit.stop() 
      shared.leftOscillator.stop() 
      shared.rightOscillator.stop() 
      shared.rainPlayer.stop() 
      shared.envelope.stop() 
      shared.setupFrequency(left: leftOscillator, right: rightOscillator, frequency: "Calm") 
     } else { 
      shared.soundIsPlaying = false 
      shared.envelope.stop() 
     } 
    } 
} 

我在ViewController.swift文件实例化的AudioPlayer单。

+1

有足够的代码和太多之间有一条细线。您提问的问题已在下面回答。你似乎有东西设置正确。测试AudioKit示例SongProcessor以查看它是否按照它的方式行事,然后将您的代码与它进行比较。有时候没有捷径和简单的解决方案。 –

回答

2

这取决于您何时开始配置AudioKit时的配置。如果您使用的是AudioKit,则应该使用其AKSettings来管理您的会话类别。基本上不仅是播放类别,还有mixWithOthers。默认情况下,做到这一点:

/// Set the audio session type 
@objc open static func setSession(category: SessionCategory, 
          with options: AVAudioSessionCategoryOptions = [.mixWithOthers]) throws { 

所以,你会做这样的事情在你的ViewController:

do { 
     if #available(iOS 10.0, *) { 
      try AKSettings.setSession(category: .playAndRecord, with: [.defaultToSpeaker, .allowBluetooth, .allowBluetoothA2DP]) 
     } else { 
      // Fallback on earlier versions 
     } 
    } catch { 
     print("Errored setting category.") 
    } 

所以我认为它获得该直线的问题。它也可能有助于设置应用程序间音频。如果您仍然遇到问题并提供更多信息,我可以提供更多帮助,但根据您迄今为止提供的信息,这是一个很好的答案。

+0

在设置完这些设置或之前,我应该启动AudioKit吗?现在我在ViewController.swift中有这个代码,但是我在另一个视图控制器中启动了AudioKit。这可能会导致问题吗? – 5AMWE5T

+1

AudioKit可能会覆盖你正在做的设置,如果你先做。我不建议在视图控制器中做任何音频。相反,为您的音频创建一个单例类 - 有时我们称之为引擎或指挥,并从您的所有视图控制器中引用它。您不希望视图控制器的生命周期对您的音频引擎的状态有任何影响。 –

+0

我有我的音频播放器在一个单身人士,我把我原来的帖子代码移入它,但问题仍然存在。 – 5AMWE5T