【问题标题】:How to stream audio for only a known duration using swift如何使用 swift 仅在已知持续时间内流式传输音频
【发布时间】:2015-08-18 20:34:02
【问题描述】:

我正在使用 AVPlayer(我不需要,但我想流式传输并尽快开始播放)来播放 m4a 文件(这是一个 iTunes 音频预览)。只有我只希望它播放该文件的一部分。 我可以设置开始时间,但不能设置结束时间。

使用计时器不起作用,因为我使用 URL 作为 http 地址。我在加载时播放,没有下载文件。

我还在 Objective-C 中看到了使用 KVO 知道音乐何时开始播放的解决方案,但我认为这不是最好的方法,因为我使用的是 swift,而且可能会出现故障,所以歌曲不会在正确的时刻停下来。

【问题讨论】:

    标签: ios iphone swift avplayer itunes-store


    【解决方案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'
    • 您需要将CMTime转换为NSValue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多