有没有办法区分AVPlayer的实时流和按需文件流?

时间:2011-07-12 15:10:07

标签: iphone cocoa-touch avfoundation avplayer live-streaming

我正在尝试为几种类型的流媒体创建更通用的媒体控制器,并希望将UI调整为流的类型;

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

有没有办法从AVPlayer(或者AVPlayerItem或AVAsset)确定流的类型是什么?

4 个答案:

答案 0 :(得分:4)

实时视频的持续时间无限期

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

只有在AVPlayerItem项状态为AVPlayerItemStatusReadyToPlay时才需要检查持续时间。

答案 1 :(得分:1)

看来这是不可能的。

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

答案 2 :(得分:0)

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

AVPlayerItem> AVPlayerItemAccessLogEvent> playingType属性可能会有所帮助。 我已经检查了“视频点播”,“直播”类型是否已从其中适当返回。

here

中的更多详细信息

答案 3 :(得分: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)
}

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