如何使用 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 套接字流式传输音频?

使用 VLC 流式传输时增加 fps 并减少持续时间

iOS 对直播的要求

如何在具有单独位置 url 和资源 url 的 swift 中从服务器实时流式传输音频?

将 mp3 从服务器流式传输到 html5 音频时传递持续时间

在 Swift 3 中从服务器流式传输 mp3 文件