【问题标题】:tvOS AVPlayerViewController Video InfotvOS AVPlayerViewController 视频信息
【发布时间】:2016-01-21 23:08:39
【问题描述】:

在 tvOS 的内置应用程序中,当您观看视频时,它会在您向下滑动时显示有关该视频的信息。我找不到任何关于开发人员如何做同样事情的信息。我确信它被设计为可能,因为它说“向下滑动以获取信息”有人想通了吗?我正在使用 AVPlayerViewController。谢谢。

【问题讨论】:

  • 如果您检查日志,当您向下滑动后出现“信息”视图时,会出现警告:不鼓励在分离的视图控制器上呈现视图控制器 。所以看起来他们正在使用分离的视图控制器!
  • 我无法让“向下滑动”窗格的“信息”部分出现。它只显示“音频”部分。对于我的每个AVPlayerItems,我将AVMutableMetadataItems 附加到externalMetadata 数组,但它仍然没有出现。 Apple 表示有可能:developer.apple.com/library/ios/documentation/AVFoundation/… 在“外部元数据”下。另见developer.apple.com/library/prerelease/tvos/documentation/…
  • 想通了。看我的回答。

标签: tvos avplayerviewcontroller


【解决方案1】:

仅供参考,我无法让它显示在运行 tvOS 12.2 或 13(测试版)的模拟器上。最终让它工作的是添加metadataItem.locale = NSLocale.current。把它注释掉,它不会出现。

【讨论】:

    【解决方案2】:

    接受的答案是正确的。我们可以使用AVMutableMetadataItem提供视频相关信息。

    但是如果您需要在播放器菜单中有更多选项,最好创建一个带有自定义信息和设置选项的UIViewController [根据您的要求] 并将其设置为AVPlayerViewControllercustomInfoViewController

    tvOS 11.0 提供此功能

    苹果官方文档:Apple Docs Link

    【讨论】:

      【解决方案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,因为这是一个同步调用
      • 感谢@BrianFLeighty,没有考虑到这一点。这可能会导致高质量图像出现问题。但很可能这些艺术品的尺寸较小。不过还是谢谢。
      【解决方案4】:

      除了杰夫的回答,这是我用来避免重复的功能:

      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)))
      

      【讨论】:

        【解决方案5】:

        要让“信息”部分显示在AVPlayerViewController 的“向下滑动查看信息”窗格中,您可以使用AVMetadataKeySpaceCommon 键空间和以下任意键创建AVMutableMetadataItems:

        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)
        

        这没有很好的记录。 This forum post 是解决这个问题的关键。


        @JenelEjercitoMyers 的 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;
        

        【讨论】:

        • 谢谢。在任何地方都找不到如何做到这一点。感谢分享。
        • 没问题,@BrianFLeighty。乐意效劳。我也有同样的问题。
        • 我遇到了一个问题,即“信息”/元数据在加载到“向下滑动以获取信息”视图后会淡出。知道该怎么做吗?
        • @SerenadeX,我相信这是模拟器的错误。我看到同样的事情。但是,在实际设备上测试,我没有这个问题。
        • 你能写这个例子吗客观cpleaaseee @JeffBowen (:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多