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

ippsafx7  于 2023-06-07  发布在  iOS
关注(0)|答案(2)|浏览(205)

我有一个来自http响应的音频数据流。我使用URLSessionDataDelegate方法接收字节包:
urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
我已经成功地播放了音频后,追加所有的数据包到一个单一的数据对象,使用AVAudioPlayer对象和它的initWithData:初始化方法。
我真正想做的是在数据仍在输入时开始音频播放- * 有效地流式音频 *。我还没有看到任何答案,似乎优雅的这个用例。
我看到的选项有:
1.使用AudioToolbox:音频文件流服务和音频队列
1.使用NSStream API,写入文件并同时播放该文件中的音频
我如何实现音频流播放从数据包进来?

6fe3ivhb

6fe3ivhb1#

最简单的方法是使用AVFoundation框架的AVPlayer。使用您的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()
n9vozmp4

n9vozmp42#

考虑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

相关问题