如何在Swift中从HTTP数据流中播放音频

7
我从http响应中获得了一个音频数据流。我使用URLSessionDataDelegate方法收到一系列字节包: urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
将所有数据包附加到单个数据对象中后,我成功地播放了音频,使用AVAudioPlayer对象和它的initWithData:初始化方法。
我真正想做的是在数据仍在传输时开始音频播放 - 实现“流式音频”。我没有看到任何对于这种情况优雅的答案。
我看到的选项有:
1. 使用AudioToolbox:Audio File Stream Services和Audio Queues 2. 使用NSStream API,同时将文件写入并从该文件播放音频
如何实现来自传入数据包的音频流式播放?

你考虑过使用 AVPlayer 吗? - Adeel Miraj
我已经看过一两个使用AVAssetResouceLoader的例子,但并不深入。我也可以接受使用AVPlayer的解决方案,那会是什么样子呢? - Peza
2个回答

5

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

    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()

4
考虑使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接