如何使用 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")
    }
}