swift - 如何在 tvOS 中为我​​的视频添加导航标记作为章节?

标签 swift swift3 tvos

描述:

我正在尝试了解(疯狂)如何在 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 视频中将导航标记实现为“章节”。对每个部分应该完成什么的详细解释同样会非常有帮助。

最佳答案

介绍

添加章节的概念并不像我原先想象的那么复杂。您需要使用以下主要类:

  • AVMetadataItem
  • AVMutableMetadataItem
  • AVTimedMetadataGroup
  • AVNavigationMarkersGroup

第 1 部分:创建章节生成方法

为了简化工作,我们将创建一个生成“章节”的方法,或者您将看到一个 AVTimedMetadataGroup,它由一个 title、一个 description,以及开始时间。

我遇到的主要问题是,在 Swift2 中,我们可以直接使用 AVMetadataItem (编辑:这实际上是错误的,在他们的示例中,他们创建了一个名为 AVMettadataItem 的自定义类使用 AVMutableMetadataItem 来生成他们想要的东西) 这在 Swift3 中是不可能的了。但是,这可以通过 AVMutableMetadataItem

解决

例如,这就是我们为章节标题创建 AVMutableMetadataItem 的方式:

let titleItem =  AVMutableMetadataItem()
titleItem.identifier = AVMetadataCommonIdentifierTitle
titleItem.value = title as (NSCopying & NSObjectProtocol)?

这些项目中的每一个都需要添加到我们称之为“项目”的列表中([AVMetadataItem])

列表完成后,您需要使用刚刚创建的列表和将应用于视频的 timeRange 创建 AVTimedMetadataGroup(又名:章节将从何处开始以及如何开始持续很长时间)

在我的例子中,章节持续时间不是什么大问题,所以我将它设置为固定时间(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)

}

第 2 部分:将章节添加到 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)

第 3 部分:将图像添加到您的章节

即将推出...

https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/UsingAVKitPlatformFeatures/UsingAVKitPlatformFeatures.html

关于swift - 如何在 tvOS 中为我​​的视频添加导航标记作为章节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39610817/

相关文章:

ios - 如何在 Swift 中展开/折叠 Collection View 部分?

ios - 自动布局中的中心 Storyboard View

ios - 如何上传用户个人资料图片

ios - 如何在 swift 3 中更改 TabBar 中禁用项目的颜色?

objective-c - 在 tvOS 上播放时出现 AVPlayer 错误

ios - 我应该有注册/登录流程来在 tvOS 应用程序中实现应用程序内购买吗?

swift - 永远不会使用不可变值 X 考虑用 Swift 2 中的 '_' 错误替换

swift - Alamofire http post - 注册用户 Swift 3

swift - Xcode 8 测试版 6 : AnyObject replaced by Any: where is classForCoder?

swift - 检测 UIViewController 何时被 tvOS 中的 Remote 菜单按钮关闭