如何使用 swift 仅在已知持续时间内流式传输音频
Posted
技术标签:
【中文标题】如何使用 swift 仅在已知持续时间内流式传输音频【英文标题】:How to stream audio for only a known duration using swift 【发布时间】:2015-08-18 20:34:02 【问题描述】:我正在使用 AVPlayer(我不需要,但我想流式传输并尽快开始播放)来播放 m4a 文件(这是一个 iTunes 音频预览)。只有我只希望它播放该文件的一部分。 我可以设置开始时间,但不能设置结束时间。
使用计时器不起作用,因为我使用 URL 作为 http 地址。我在加载时播放,没有下载文件。
我还在 Objective-C 中看到了使用 KVO 知道音乐何时开始播放的解决方案,但我认为这不是最好的方法,因为我使用的是 swift,而且可能会出现故障,所以歌曲不会在正确的时刻停下来。
【问题讨论】:
【参考方案1】:您可以将addBoundaryTimeObserverForTimes 添加到您的 AVPlayer,如下所示:
更新:Xcode 8.3.2 • Swift 3.1
import UIKit
import AVFoundation
class ViewController: UIViewController
var player: AVPlayer!
var observer: Any!
override func viewDidLoad()
super.viewDidLoad()
guard let url = URL(string: "https://www.example.com/audio.mp3") else return
player = AVPlayer(url: url)
let boundary: TimeInterval = 30
let times = [NSValue(time: CMTimeMake(Int64(boundary), 1))]
observer = player.addBoundaryTimeObserver(forTimes: times, queue: nil)
[weak self] time in
print("30s reached")
if let observer = self?.observer
self?.player.removeTimeObserver(observer)
self?.player.pause()
player.play()
print("started loading")
【讨论】:
谢谢!它与硬编码的时间完美配合。但是我尝试了 audioPlayer.addBoundaryTimeObserverForTimes([CMTimeMake(Int64(timeInterval), 1)], queue: dispatch_get_main_queue()) 但它不起作用。你知道应该作为参数传递什么类型吗? [AnyObject] NSValue 对象数组,其中包含 CMTime 值,表示调用块的时间。 不,实际上没有错字。我正在添加一个 CMTime 数组,但我无法使用类型为 '([CMTime], queue: dispatch_queue_t!, () -> Void)' 的参数列表调用 'addBoundaryTimeObserverForTimes' 让我们continue this discussion in chat。 您需要将CMTime转换为NSValue以上是关于如何使用 swift 仅在已知持续时间内流式传输音频的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS swift 中使用 UDP 套接字流式传输音频?
如何在具有单独位置 url 和资源 url 的 swift 中从服务器实时流式传输音频?