我试图理解(疯狂)如何在tvOS中为我的视频添加导航标记。
逻辑上它不应该是复杂的。指定标记列表,其中包含章节起点,章节标题和特定视频点的缩略图。
但是,我很难掌握如何实现这一点。
我认为这是实施此项目的最低要求,但我不知道为什么我需要这一切才能实现。我也不知道我应该如何设置信息。
//In my AVPlayerViewController
let metadataItem = AVMetadataItem()
let metadataItemList = [metadataItem]
let cmTimeStart = CMTimeMake(0, 0)
let cmTimeDuration = CMTimeMake(10, 1)
let timeRange = CMTimeRange(start: cmTimeStart, duration: cmTimeDuration)
let timedMetadataGroup = AVTimedMetadataGroup(items: metadataItemList, timeRange: timeRange)
let timedMetadataGroupList = [timedMetadataGroup]
let navigationMarkersGroup = AVNavigationMarkersGroup(title: "Chapters", timedNavigationMarkers: timedMetadataGroupList)
//Already previously initialized avPlayerItem
avPlayerItem.navigationMarkerGroups.append(navigationMarkersGroup)
(上面代码的目标是为我的视频显示一章。)
我正在寻求明确如何实施导航标记作为"章节"在我的tvOS视频中。关于每个部分应该完成什么的详细解释同样非常有用。
答案 0 :(得分:1)
为了能够添加章节,这个概念并不像我原先想象的那么复杂。您需要使用以下主要类:
AVMetadataItem
AVMutableMetadataItem
AVTimedMetadataGroup
AVNavigationMarkersGroup
为了简化工作,我们将创建一个方法来生成一个"章节"或者,当您看到由AVTimedMetadataGroup
,title
和开始时间组成的description
时。
我遇到的主要问题是在Swift2中我们可以直接用AVMetadataItem
指定标识符类型(编辑:这实际上是错误的,在他们的示例中他们创建了一个名为AVMettadataItem的自定义类,它使用AVMutableMetadataItem来用Swift3
生成他们想要的东西,这是不可能的。但是,这可以通过AVMutableMetadataItem
例如,这就是我们为章节标题创建AVMutableMetadataItem
的方式:
let titleItem = AVMutableMetadataItem()
titleItem.identifier = AVMetadataCommonIdentifierTitle
titleItem.value = title as (NSCopying & NSObjectProtocol)?
这些项目中的每一项都需要添加到我们称之为“" item" ([AVMetadataItem]
)
完成列表后,您将要创建AVTimedMetadataGroup
,其中包含您刚刚创建的列表以及将应用于您的视频的timeRange(也就是:您的章节将在哪里开始,以及多长时间)它持续)
在我的情况下,章节持续时间并不重要,因此我将其设置为固定时间(10秒)。
您需要注意的是,如果CMTime
无效,则该章节不会显示在列表中。
private func setupNavigationMarker(title: String, description: String, timeStart: Int64)-> AVTimedMetadataGroup {
let timeRange = CMTimeRange(start: CMTimeMake(timeStart, 1), duration: CMTimeMake(10, 1))
var items: [AVMetadataItem] = []
let titleItem = AVMutableMetadataItem()
titleItem.identifier = AVMetadataCommonIdentifierTitle
titleItem.value = title as (NSCopying & NSObjectProtocol)?
items.append(titleItem)
let descriptionItem = AVMutableMetadataItem()
descriptionItem.identifier = AVMetadataCommonIdentifierDescription
descriptionItem.value = description as (NSCopying & NSObjectProtocol)?
items.append(descriptionItem)
return AVTimedMetadataGroup(items: items, timeRange: timeRange)
}
AVNavigationMarkerGroup
然后在AVPlayerViewController中的某个地方(如ViewDidLoad
):
var timedMetadataGroupList = [AVTimedMetadataGroup]()
timedMetadataGroupList.append(self.setupNavigationMarker(title: "test1", description: "description test1" , timeStart: 100))
timedMetadataGroupList.append(self.setupNavigationMarker(title: "test2", description: "description test2" , timeStart: 200))
timedMetadataGroupList.append(self.setupNavigationMarker(title: "test3", description: "description test3" , timeStart: 300))
let navigationMarkersGroup = AVNavigationMarkersGroup(title: "Chapters", timedNavigationMarkers: timedMetadataGroupList)
avPlayerItem.navigationMarkerGroups.append(navigationMarkersGroup)
即将推出......