如何快速播放来自http数据流的音频
Posted
技术标签:
【中文标题】如何快速播放来自http数据流的音频【英文标题】:How to play audio from an http data stream in swift 【发布时间】:2018-07-30 10:30:24 【问题描述】:我有一个来自 http 响应的音频数据流。我使用 URLSessionDataDelegate 方法接收字节数据包:
urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
在使用AVAudioPlayer
对象和initWithData:
初始化方法将所有数据包附加到单个数据对象后,我已经成功播放了音频。
我真正想做的是在数据仍在进入时开始音频播放 - 有效地流式传输音频。对于这个用例,我还没有看到任何看起来很优雅的答案。
我见过的选项是:
-
使用 AudioToolbox:音频文件流服务和音频队列
使用 NSStream API,写入文件并同时播放该文件中的音频
如何从传入的数据包中实现音频流播放?
【问题讨论】:
您是否考虑过为此使用AVPlayer
?
我看过一两个使用AVAssetResouceLoader
的例子,但并不深入。我对 AVPlayer 的解决方案持开放态度,那会是什么样子?
【参考方案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
【讨论】:
【参考方案2】:最简单的方法是使用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()
【讨论】:
以上是关于如何快速播放来自http数据流的音频的主要内容,如果未能解决你的问题,请参考以下文章
如何使用来自 API 调用的 JSON 数据播放音频? (扬声器)