我正在尝试为几种类型的流媒体创建一个更通用的媒体控制器,并希望使 UI 适应流的类型;
- 当它是点播文件流(即正在流式传输的单个 MP3 文件)时,您应该能够向前和向后搜索。因此,搜索滑块应该是可见的。
- 当它是一个直播流时,不可能向前和向后搜索,因此应该隐藏搜索滑块。
有什么方法可以从 AVPlayer(或者可能是 AVPlayerItem 或 AVAsset)确定流的类型是什么?
我正在尝试为几种类型的流媒体创建一个更通用的媒体控制器,并希望使 UI 适应流的类型;
有什么方法可以从 AVPlayer(或者可能是 AVPlayerItem 或 AVAsset)确定流的类型是什么?
实时视频的持续时间是不确定的:
AVPlayer * player = ...;
const BOOL isLive = CMTIME_IS_INDEFINITE([player currentItem].duration);
只有当AVPlayerItem
项目状态为时,您才需要检查持续时间AVPlayerItemStatusReadyToPlay
。
对于那些仍在寻找此功能的人,
AVPlayerItem > AVPlayerItemAccessLogEvent > playbackType 属性可能会有所帮助。我已经检查了“VOD”,“LIVE”类型已正确返回。
更多细节在这里
看来这是不可能的。
但是,可以检查直播的持续时间,这似乎始终高于 33000 秒。但是,此值仍然会波动,并且不希望对此进行检查,因为它可能会导致意外行为。
您可以使用此代码轻松检测播放类型:
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)
}
希望这会对某人有所帮助:)