tvOS AVPlayerViewController 视频信息

14
在tvOS的内置应用程序中,当您观看视频时,向下滑动会显示有关该视频的信息。我找不到任何关于开发人员如何做到这一点的信息。我相信它是可以实现的,因为它上面写着“向下滑动查看信息”。有人弄清楚了吗?我正在使用AVPlayerViewController。

如果您检查日志,当您向下滑动后,“信息”视图出现时,会出现一个警告:不建议在分离的视图控制器上呈现视图控制器<AVNowPlayingPlaybackControlsViewController: 0x126140c00>。因此,看起来他们正在使用一个分离的视图控制器! - Sylverb
我无法让“Info”部分出现在下拉窗格中。它只显示“Audio”部分。对于我的每个AVPlayerItem,我都将AVMutableMetadataItems附加到externalMetadata数组中,但其仍未显示出来。苹果在此处表示这是可能的:https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVPlayerViewController_Class/ ,请参阅“外部元数据”。另请参见https://developer.apple.com/library/prerelease/tvos/documentation/AVFoundation/Reference/AVPlayerItem_Class/index.html#//apple_ref/occ/instp/AVPlayerItem/externalMetadata。 - Jeff Bowen
搞定了,看我的答案。 - Jeff Bowen
6个回答

22
要在“向下滑动以获取信息”窗格中显示“信息”部分,您需要使用AVPlayerViewController创建带有AVMetadataKeySpaceCommon键空间和以下任意键的AVMutableMetadataItem
AVMetadataCommonKeyTitle
AVMetadataCommonKeyDescription
AVMetadataiTunesMetadataKeyContentRating
AVMetadataQuickTimeMetadataKeyGenre

将它们添加到AVPlayerItemexternalMetadata数组中。为了使每个AVMutableMetadataItem显示出来,您至少必须设置identifierextendedLanguageTagvalue属性。以下是一个示例:
let mediaItem = AVPlayerItem(URL: mediaURL)

let titleMetadataItem = AVMutableMetadataItem()
titleMetadataItem.locale = NSLocale.currentLocale()
titleMetadataItem.key = AVMetadataCommonKeyTitle
titleMetadataItem.keySpace = AVMetadataKeySpaceCommon
titleMetadataItem.value = "The Title"
                        
let descriptionMetadataItem = AVMutableMetadataItem()
descriptionMetadataItem.locale = NSLocale.currentLocale()
descriptionMetadataItem.key = AVMetadataCommonKeyDescription
descriptionMetadataItem.keySpace = AVMetadataKeySpaceCommon
descriptionMetadataItem.value = "This is the description"

mediaItem.externalMetadata.append(titleMetadataItem)
mediaItem.externalMetadata.append(descriptionMetadataItem)

这个没有很好的记录。这个论坛帖子对于弄清楚这个问题至关重要。

Objective-C示例:

AVPlayerItem *mediaItem = [[AVPlayerItem alloc] initWithURL:mediaURL];

AVMutableMetadataItem *titleMetadataItem = [[AVMutableMetadataItem alloc] init];
titleMetadataItem.locale = NSLocale.currentLocale;
titleMetadataItem.key = AVMetadataCommonKeyTitle;  
titleMetadataItem.keySpace = AVMetadataKeySpaceCommon;  
titleMetadataItem.value = @"The Title";

NSArray *externalMetadata = [[NSArray alloc] initWithObjects:titleMetadataItem, nil];

mediaItem.externalMetadata = externalMetadata;

我遇到了一个问题,就是在“向下滑动以获取信息”视图加载后,“信息”/元数据会逐渐消失。你有什么想法是什么原因导致的吗? - Serenade X
@SerenadeX,我认为这是模拟器的一个bug。我也遇到了同样的问题。然而,在实际设备上测试,我没有那个问题。 - Jeff Bowen
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/94974/discussion-between-jenel-ejercito-myers-and-jeff-bowen。 - Jenel Ejercito Myers
我遇到了编译错误:“在类型为'AVPlayerItem *'的对象上未找到属性'externalMetadata' - 使用tvOS 9.1和最新的XCode 7.2。有什么想法吗? - Luis Artola
@JeffBowen 是的,它是运行在真正的Apple TV上的tvOS。我已经把它编译了起来,但还不能完全地工作。我发现仅仅通过导入模块并不能自动链接正确的框架。我不得不做@@import AVKit,并在项目设置中添加AVKit框架。现在它可以编译和运行。但是,当我在遥控器上向下滑动时,我的自定义标题和描述不会显示出来。 - Luis Artola
显示剩余10条评论

5
被接受的答案是正确的。我们可以使用 AVMutableMetadataItem 提供有关视频的信息。
但是,如果您需要在播放器菜单中拥有更多选项,则最好创建一个带有自定义信息和设置选项的 UIViewController [基于您的要求] 并将其设置为 AVPlayerViewControllercustomInfoViewController

这在 tvOS 11.0 中可用

enter image description here

有关此内容的官方 Apple 文档:Apple Docs Link


4
除了Jeff的答案,这是我用来避免重复性的函数:
private func setupMetadata(data: String, key: (NSCopying & NSObjectProtocol))->AVMutableMetadataItem{

    let metadataItem = AVMutableMetadataItem()
    metadataItem.locale = NSLocale.current
    metadataItem.key = key
    metadataItem.keySpace = AVMetadataKeySpaceCommon
    metadataItem.value = data as (NSCopying & NSObjectProtocol)?

    return metadataItem

}

并且正在使用:

    //in AVPlayerViewControler
    //Suppose you have an already initialized avPlayerItem
    avPlayerItem.externalMetadata.append(self.setupMetadata(data: "title of video", key: AVMetadataCommonKeyTitle as (NSCopying & NSObjectProtocol)))
    avPlayerItem.externalMetadata.append(self.setupMetadata(data: "RugDealer", key: AVMetadataCommonKeyAuthor as (NSCopying & NSObjectProtocol)))
    avPlayerItem.externalMetadata.append(self.setupMetadata(data: "Description of the video", key: AVMetadataCommonKeyDescription as (NSCopying & NSObjectProtocol)))

@Fattie 你的悬赏 - 你有具体的问题吗,还是你真的想要“奖励一个现有的答案”? - undefined
嗨 @Krokomot,我不太明白你的问题,也不知道你为什么要问这个问题?屏幕顶部的蓝色框会提供有关赏金的完整信息。如果你对赏金的性质有任何一般性的问题,或许可以使用元站点或向管理员提问,我不知道呢? - undefined

3
除了上面的答案,我还想在顶部架上添加艺术作品、流派和内容评级。这与上述略有不同。它们可以按以下方式添加到externalMetadata数组中。
//Sets the content rating on the top shelf
AVMutableMetadataItem *ratingInfo = [[AVMutableMetadataItem alloc] init];
ratingInfo.key = AVMetadataiTunesMetadataKeyContentRating;
ratingInfo.keySpace = AVMetadataKeySpaceiTunes;
ratingInfo.locale = [NSLocale currentLocale];
ratingInfo.value = @"PG-13"; //Rating of the video
ratingInfo.extendedLanguageTag = @"und";
[externalMetadata addObject:ratingInfo];

//Sets the thumbnail on the shelf
AVMutableMetadataItem *artwork1 = [[AVMutableMetadataItem alloc] init];
artwork1.key = AVMetadataCommonKeyArtwork;
artwork1.keySpace = AVMetadataKeySpaceCommon;
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:artworkAddress]];
artwork1.value = imageData;
artwork1.locale = [NSLocale currentLocale];
[externalMetadata addObject:artwork1];

//Sets the Genre on the shelf
AVMutableMetadataItem *genresInfo = [[AVMutableMetadataItem alloc] init];
genresInfo.key = AVMetadataQuickTimeMetadataKeyGenre;
genresInfo.keySpace = AVMetadataKeySpaceQuickTimeMetadata;
genresInfo.locale = [NSLocale currentLocale];
genresInfo.value = @"Drama, Medical";
[externalMetadata addObject:genresInfo];

谨慎使用dataWithContentsOfURL,因为这是一个同步调用。 - Brian F Leighty
谢谢@BrianFLeighty,我没有考虑到这一点。这可能会导致高质量图像出现问题。但最有可能的是这些艺术品尺寸较小。还是谢谢。 - Vinay Kini

2

@kemicofaghost的回答已更新

这是@kemicofaghost的精彩回答已经更新了

 func meta(_ data: String, key: AVMetadataKey) -> AVMutableMetadataItem {

    let mdi = AVMutableMetadataItem()
    mdi.locale = NSLocale.current
    mdi.key = key as (NSCopying & NSObjectProtocol)
    mdi.keySpace = AVMetadataKeySpace.common
    mdi.value = data as (NSCopying & NSObjectProtocol)?
    return mdi
 }

然后

 someItem.externalMetadata.append(meta("Episode 13", key:.commonKeyTitle) )

(它会方便地为您自动填充许多键。它们在这里列出。)
(还要注意,苹果公司终于有了一个页面,解释了其中许多值...)

https://developer.apple.com/documentation/avkit/customizing_the_tvos_playback_experience


0

顺便说一下,我无法在运行tvOS 12.2或13(beta)的模拟器上显示它。最终让它工作的是添加metadataItem.locale = NSLocale.current。如果将其注释掉,则不会出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接