首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许后台音频与Swift不工作

允许后台音频与Swift不工作
EN

Stack Overflow用户
提问于 2017-10-21 08:36:41
回答 1查看 1.1K关注 0票数 4

我想让背景音频,而应用程序是不对焦。我目前有这样的代码,它应该允许:

代码语言:javascript
复制
do {
    try AKSettings.setSession(category: .playback, with: .mixWithOthers)
} catch {
    print("error")
}
AKSettings.playbackWhileMuted = true

我还在功能设置中启用了“Audio,Airplay和Picture in Picture”设置。然而,当我按下我的设备上的主按钮时,音频不再继续播放。我做错了什么?如果这件事重要的话,我正在使用AudioKit来发出声音。

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

代码语言:javascript
复制
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单例将其发送到特定的频率(我有大约十几个这样的视图控制器,每个控制器都有自己的频率设置):

代码语言:javascript
复制
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()
        }
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-21 08:53:35

这取决于您何时进行配置,以及何时启动AudioKit。如果您使用的是AudioKit,您应该使用它的AKSettings来管理会话类别。基本上,不仅是播放类别,还包括mixWithOthers。默认情况下,这样做是:

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

所以你可以在你的ViewController里做这样的事情:

代码语言:javascript
复制
    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.")
    }

所以我认为这是一个理直气壮的问题。它也可能有助于设置应用程序间音频。如果你仍然有麻烦,并提供更多的信息,我可以帮助更多,但这是一个很好的答案,因为我可以收集根据你提供的信息到目前为止。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46861515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档