【问题标题】:How to play audio in background with Swift?如何使用 Swift 在后台播放音频?
【发布时间】:2015-07-28 14:50:55
【问题描述】:

如您所见,我正在流式传输音频广播。但是当我按下主页按钮并退出应用程序流媒体停止或我听不见。如何继续在后台流式传输并从锁定屏幕收听?

ViewController.Swift

import UIKit
import AVFoundation
import MediaPlayer
import GoogleMobileAds


    class ViewController: UIViewController, GADInterstitialDelegate {
    
        @IBOutlet weak var exitMapButton: UIButton!
        @IBOutlet weak var radarMap: UIWebView!
        var interstitial: GADInterstitial!
        func createAndLoadInterstitial() -> GADInterstitial {
            var interstitial = GADInterstitial(adUnitID: "adUnitID-XXXX")
            interstitial.delegate = self
            interstitial.loadRequest(GADRequest())
            return interstitial
        }
        
        func getAd(){
            if (self.interstitial.isReady)
            {
                self.interstitial.presentFromRootViewController(self)
                self.interstitial = self.createAndLoadInterstitial()
            }
        }
        @IBOutlet weak var ataturkButton: UIButton!
        @IBOutlet weak var sabihaButton: UIButton!
        @IBOutlet weak var esenbogaButton: UIButton!
        @IBOutlet weak var weatherButton: UIButton!
        @IBOutlet weak var statusLabel: UILabel!
        @IBOutlet weak var playButton: UIButton!
        @IBOutlet weak var webViewButton: UIButton!
        var googleBannerView: GADBannerView!
override func viewDidLoad() {
            super.viewDidLoad()
        }
class PlayerAv {
            var audioLink: String?
            var player: AVPlayer
            init(link: String) {
                self.audioLink = link
                self.player = AVPlayer(URL: NSURL(string: link))
            }
        }
        var myPlayer = PlayerAv(link: "http://somewebsite.com/abc.pls")
        var setTowerState = ""
        
        @IBAction func sliderValueChanged(sender: UISlider) {
            var currentValue = Float(sender.value)
            println(currentValue)
            myPlayer.player.volume = currentValue
        }
        @IBAction func getWeatherWindow(sender: AnyObject) {
            UIApplication.sharedApplication().openURL(NSURL(string: "http://somewebpage.com")!)
            println("Directed to weather page")
        }
        @IBAction func changeToAtaturk() {
            myPlayer.player.pause()
            myPlayer = PlayerAv(link: "http://somewebsite.com/abc.pls")
            myPlayer.audioLink == ""
            println("\(myPlayer.audioLink!)--a")
            playButton.setTitle("Pause", forState: UIControlState.Normal)
            myPlayer.player.play()
            setTowerState = "ataturk"
            statusLabel.text = "Status: Playing, LTBA"
        }
        @IBAction func changeToEsenboga() {
            myPlayer.player.pause()
            myPlayer = PlayerAv(link: "http://somewebsite.com/def.pls")
            println("\(myPlayer.audioLink!)--a")
            playButton.setTitle("Pause", forState: UIControlState.Normal)
            myPlayer.player.play()
            setTowerState = "esenboga"
            statusLabel.text = "Status: Playing, LTAC"
        }
        @IBAction func changeToSabiha() {
            myPlayer.player.pause()
            myPlayer = PlayerAv(link: "http://somewebsite.com/efg.pls")
            println("\(myPlayer.audioLink!)--a")
            playButton.setTitle("Pause", forState: UIControlState.Normal)
            myPlayer.player.play()
            setTowerState = "sabiha"
            statusLabel.text = "Status: Playing, LTFJ"
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        @IBAction func playButtonPressed(sender: AnyObject) {
            toggle()
        }
        func toggle() {
            if playButton.titleLabel?.text == "Play" {
                playRadio()
                println("Playing")
                statusLabel.text = "Status: Playing"
            } else {
                pauseRadio()
                println("Paused")
                statusLabel.text = "Status: Paused"
            }
        }
        func playRadio() {
            myPlayer.player.play()
            playButton.setTitle("Pause", forState: UIControlState.Normal)   
        }
        func pauseRadio() {
            myPlayer.player.pause()
            playButton.setTitle("Play", forState: UIControlState.Normal)
        }
    }

【问题讨论】:

    标签: ios swift audio avfoundation


    【解决方案1】:

    您需要设置您的应用功能背景模式(音频和 AirPlay)并将您的 AVAudioSession 类别设置为 AVAudioSessionCategoryPlayback 并将其设置为活动

    来自 Xcode 11.4 • Swift 5.2

    do {
        try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .allowAirPlay])
        print("Playback OK")
        try AVAudioSession.sharedInstance().setActive(true)
        print("Session is Active")
    } catch {
        print(error)
    }
    

    【讨论】:

    • @LeoDabus 我们将该代码放在哪里?我将它添加到 viewDidLoad 和应用程序委托中,但它不起作用。对它应该去哪里感到困惑?
    • @lukeslvi 在您尝试开始播放音频之前的任何位置。
    • 嘿@LeoDabus 它仍然关闭。我将它添加到 cellForRowAtIndexPath 以及 App Delegate 中,但它不起作用。我还将它添加到自定义单元格中,但没有任何运气。有什么想法可能是错的吗?顺便说一句,我正在使用 YouTubeSDK,但我假设声音是健全的,这并不重要。请告诉我。谢谢!
    • 不一样。您无法在后台播放视频。
    • 但是声音呢? @LeoDabus
    【解决方案2】:

    Xcode 10.2.1 Swift 4

    请在您的AppDelegate

    中添加以下代码
    func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
            do {
                try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault, options: [.mixWithOthers, .allowAirPlay])
                print("Playback OK")
                try AVAudioSession.sharedInstance().setActive(true)
                print("Session is Active")
            } catch {
                print(error)
            }
            return true
        }
    

    注意:-请根据需要配置选项。例如,在播放视频文件时停止背景音频添加

     options: [.allowAirPlay, .defaultToSpeaker]
    

    别忘了在后台模式下启用音频和播放

    【讨论】:

    • 你是个天才。这是我能够找到的唯一方法,可以使用当前的 swiftUI 应用程序在后台运行音频。谢谢!
    【解决方案3】:

    仅粘贴在 viewDidload 上

        let path = Bundle.main.path(forResource:"Bismallah", ofType: "mp3")
    
        do{
            try playerr = AVAudioPlayer(contentsOf: URL(fileURLWithPath: path!))
        } catch {
            print("File is not Loaded")
        }
        let session = AVAudioSession.sharedInstance()
        do{
            try session.setCategory(AVAudioSessionCategoryPlayback)
        }
        catch{
        }
    
        player.play()
    

    【讨论】:

    • 优秀为我工作只将此代码粘贴到 viewdidload()
    【解决方案4】:

    Swift 5 Xcode 11.2.1

    在您初始化 AudioPlayer 的地方添加此代码。

    audioPlayer.delegate = self
    audioPlayer.prepareToPlay()
    let audioSession = AVAudioSession.sharedInstance()
    do{
        try audioSession.setCategory(AVAudioSession.Category.playback)
    }
    catch{
        fatalError("playback failed")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多