2017-10-21 2 views
2

앱에 포커스가 있지 않을 때 배경 오디오를 허용하고 싶습니다. 현재이 코드를 허용해야합니다 :Swift가 작동하지 않는 백그라운드 오디오 허용

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

기능 설정에서 '오디오, 에어 플레이 및 Picture in Picture'설정이 활성화되어 있습니다. 그러나 내 장치의 홈 단추를 누르면 오디오가 계속 재생되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 그게 중요하다면 나는 소리를 내기 위해 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

관련 문제