如何使用 swift 仅在已知持续时间内流式传输音频
How to stream audio for only a known duration using swift
我正在使用 AVPlayer(我不需要,但我想流式传输并尽快开始播放)来播放 m4a 文件(它是 iTunes 音频预览)。只有我只希望它播放该文件的一部分。
我可以设置开始时间,但不能设置结束时间。
使用计时器不起作用,因为我使用 URL 作为 http 地址。我在加载时播放,没有下载文件。
我还在 Objective-C 中看到了使用 KVO 知道音乐何时开始播放的解决方案,但我认为这不是最好的方法,因为我正在使用 swift 并且还因为故障这可能会发生,因此歌曲不会在正确的时刻停止。
您可以添加 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")
}
}
我正在使用 AVPlayer(我不需要,但我想流式传输并尽快开始播放)来播放 m4a 文件(它是 iTunes 音频预览)。只有我只希望它播放该文件的一部分。 我可以设置开始时间,但不能设置结束时间。
使用计时器不起作用,因为我使用 URL 作为 http 地址。我在加载时播放,没有下载文件。
我还在 Objective-C 中看到了使用 KVO 知道音乐何时开始播放的解决方案,但我认为这不是最好的方法,因为我正在使用 swift 并且还因为故障这可能会发生,因此歌曲不会在正确的时刻停止。
您可以添加 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")
}
}