4

我正在尝试为几种类型的流媒体创建一个更通用的媒体控制器,并希望使 UI 适应流的类型;

  • 当它是点播文件流(即正在流式传输的单个 MP3 文件)时,您应该能够向前和向后搜索。因此,搜索滑块应该是可见的。
  • 当它是一个直播流时,不可能向前和向后搜索,因此应该隐藏搜索滑块。

有什么方法可以从 AVPlayer(或者可能是 AVPlayerItem 或 AVAsset)确定流的类型是什么?

4

4 回答 4

6

实时视频的持续时间是不确定的:

AVPlayer * player = ...;
const BOOL isLive = CMTIME_IS_INDEFINITE([player currentItem].duration);

只有当AVPlayerItem项目状态为时,您才需要检查持续时间AVPlayerItemStatusReadyToPlay

于 2016-12-23T00:00:27.077 回答
2

对于那些仍在寻找此功能的人,

AVPlayerItem > AVPlayerItemAccessLogEvent > playbackType 属性可能会有所帮助。我已经检查了“VOD”,“LIVE”类型已正确返回。

更多细节在这里

于 2019-11-22T11:31:14.473 回答
1

看来这是不可能的。

但是,可以检查直播的持续时间,这似乎始终高于 33000 秒。但是,此值仍然会波动,并且不希望对此进行检查,因为它可能会导致意外行为。

于 2011-09-15T14:55:13.913 回答
0

解决方案

您可以使用此代码轻松检测播放类型:

NotificationCenter.default.addObserver(
            forName: NSNotification.Name.AVPlayerItemNewAccessLogEntry,
            object: nil,
            queue: OperationQueue.main) { [weak self] (notification) in
                guard let self = self else { return }

                guard let playerItem = notification.object as? AVPlayerItem,
                    let lastEvent = playerItem.accessLog()?.events.last else {
                    return
                }

                // Here you can set the type (LIVE | VOD | FILE or unknow if it's a nil):
                print("Playback Type: \(lastEvent.playbackType ?? "NA")")
        }

将观察者代码添加到您通常开始收听它们的位置。

另外,不要忘记在 deinit 处删除观察者;)

deinit {
    NotificationCenter.default.removeObserver(self,
                           name: NSNotification.Name.AVPlayerItemNewAccessLogEntry,
                         object: self)
}

希望这会对某人有所帮助:)

于 2020-04-03T04:59:48.653 回答