How to stream audio from URL without downloading mp3 file on device

后端 未结 5 572
挽巷
挽巷 2021-02-09 21:18

How would I stream audio from a URL in Swift without downloading the mp3 file on the device? What do I need to import? Do I need certain libraries? Add anything to the info.plis

相关标签:
5条回答
  • 2021-02-09 22:01

    I test it with your url and it work

        var player: AVPlayer?
        let url = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"
        let playerItem = AVPlayerItem( url:NSURL( string:url )! as URL )
        player = AVPlayer(playerItem:playerItem)
        player!.rate = 1.0;
    
            player!.play()
    
    0 讨论(0)
  • 2021-02-09 22:05

    You can use iOS AVPLayer for Streaming audio from url.

    var player: AVPlayer!
    let url  = URL.init(string:   "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3")
    
    let playerItem: AVPlayerItem = AVPlayerItem(url: url!)
    player = AVPlayer(playerItem: playerItem)
    
    let playerLayer = AVPlayerLayer(player: player!)
    
    playerLayer?.frame = CGRect(x: 0, y: 0, width: 10, height: 50)
            self.view.layer.addSublayer(playerLayer!)
    player.play()
    
    0 讨论(0)
  • 2021-02-09 22:07

    For online streaming you have to use AVFoundation framework.

    var player: AVPlayer!
    
    let url = URL.init(string: "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3")
    player = AVPlayer.init(url: url!)
    

    To play:

        player.play()
    

    To pause:

        player.pause()
    
    0 讨论(0)
  • 2021-02-09 22:11

    here you can go

     import AVFoundation
    
    var progressTimer:Timer?
    {
        willSet {
            progressTimer?.invalidate()
        }
    }
    var playerStream: AVPlayer?
    var playerItem: AVPlayerItem?
    
    func playerStream(urlStream : String) {
        if let playerStream = playerStream {
            if playerStream.isPlaying {
                stopProgressTimer()
                playerStream.pause() 
            } else {  
                startProgressTimer()
                playerStream.play()
            }  
        } else {
            if let urlStr = urlStream.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
                if let TempURL = URL.init(string: urlStr) {
                    playerItem = AVPlayerItem(url: TempURL)
                    playerStream = AVPlayer(playerItem: playerItem)
                    NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidPlayToEndTime), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)
                } 
            } 
        } 
    }
    
    func playerItemDidPlayToEndTime() {
         stopProgressTimer()
         self.playProgressView.progress = 0.0
         if let playerStream = self.playerStream {
            playerStream.replaceCurrentItem(with: playerItem)
            playerStream.seek(to: kCMTimeZero)
           // playerStream.seek(to: .zero) swift 4.0
        } 
    }
    
    func stopProgressTimer() {
        progressTimer?.invalidate()
        progressTimer = nil
    }
    
    func startProgressTimer() {
        if #available(iOS 10.0, *) {
            progressTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true){ [weak self] in
                self?.updateProgressTimer()
            }
        } else {
            progressTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.updateProgressTimer), userInfo: nil, repeats: true)
        }
    }
    
    @objc func updateProgressTimer() {
        if let playerItem = playerItem {
            if let pa = playerStream {
                let floatTime = Float(CMTimeGetSeconds(pa.currentTime()))
                let floatTimeDu = Float(CMTimeGetSeconds(playerItem.duration))
    
                playProgressView.progress = Double(floatTime / floatTimeDu)
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-09 22:12
    class MusicPlayer {
        public static var instance = MusicPlayer()
        var player = AVPlayer()
    
        func initPlayer(url: String) {
            guard let url = URL(string: url) else { return }
            let playerItem = AVPlayerItem(url: url)
            player = AVPlayer(playerItem: playerItem)
            playAudioBackground()
        }
        
        func playAudioBackground() {
            do {
                try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: [.mixWithOthers, .allowAirPlay])
                print("Playback OK")
                try AVAudioSession.sharedInstance().setActive(true)
                print("Session is Active")
            } catch {
                print(error)
            }
        }
        
        func pause(){
            player.pause()
        }
        
        func play() {
            player.play()
        }
    }
    

    This class will play music in the background and play any audio/video URL.

    0 讨论(0)
提交回复
热议问题