如何在swift中播放来自http数据流的音频

时间:2018-02-20 06:06:26

标签: ios swift audio audio-streaming http-streaming

我有来自http响应的音频数据流。我使用 URLSessionDataDelegate 方法接收字节数据包:

urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)

我使用AVAudioPlayer对象及其initWithData:初始化方法将所有数据包附加到单个Data对象后成功播放了音频。

我真正想做的是在数据仍然进入时启动音频播放 - 流式传输音频。我还没有看到任何对这个用例看起来优雅的答案。

我见过的选项是:

  1. 使用AudioToolbox:音频文件流服务&音频队列
  2. 使用NSStream API,同时写入文件并从该文件播放音频
  3. 如何从进入的数据包中实现音频流播放?

2 个答案:

答案 0 :(得分:1)

根据您的要求考虑AVPlayer,如下所示:

import AVKit



var player: AVPlayer?


func audioPlayer(){
    do {
         try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
         player = AVPlayer(url: URL.init(string: "your url")!)

          //This is for a player screen, if you don't want to show a player screen you comment this part

          let controller = AVPlayerViewController()
          controller.player = player
          controller.showsPlaybackControls = false
          self.addChildViewController(controller)
          let screenSize = UIScreen.main.bounds.size
          let videoFrame = CGRect(x: 0, y: 130, width: screenSize.width, height: (screenSize.height - 130) / 2)
          controller.view.frame = videoFrame
          self.view.addSubview(controller.view)
          // till here

          player?.play()
        } catch {
        }
    }

有关详情,请参阅:https://developer.apple.com/documentation/avfoundation/avplayer

答案 1 :(得分:0)

最简单的方法是使用AVPlayer AVFoundation框架。使用您的URL实例化playerItem并将其传递给播放器。以下代码将为您完成。

    let urlString = "your url string"
    guard let url = URL.init(string: urlString)
        else {
            return
    }
    let playerItem = AVPlayerItem.init(url: url)
    player = AVPlayer.init(playerItem: playerItem)
    player.play()