TvOS AVPlayerViewController Информация о видео

Во встроенных приложениях для tvOS, когда вы смотрите видео, вы показываете информацию об этом видео при прокрутке вниз. Я не могу найти никакой информации о том, как разработчик может сделать то же самое. Я уверен, что он разработан, чтобы быть возможным, поскольку он говорит: "Проведите вниз для информации". Кто-нибудь понял это? Я использую AVPlayerViewController. Спасибо.

Ответ 1

Чтобы получить раздел "Информация", который появится на панели "Прокрутка вниз для информации" в AVPlayerViewController, вы создаете AVMutableMetadataItem с помощью клавиши AVMetadataKeySpaceCommon и любого из следующих клавиш:

AVMetadataCommonKeyTitle
AVMetadataCommonKeyDescription
AVMetadataiTunesMetadataKeyContentRating
AVMetadataQuickTimeMetadataKeyGenre

и добавьте их в массив AVPlayerItem externalMetadata. Чтобы каждый AVMutableMetadataItem отображался, вы должны, по крайней мере, установить свойства identifier, extendedLanguageTag и value. Вот пример:

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 пример для @JenelEjercitoMyers:

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;

Ответ 2

В дополнение к ответу Джеффа, это функция, которую я использую, чтобы избежать повторения:

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

Ответ 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];

Ответ 4

Принятый ответ правильный. Мы можем использовать AVMutableMetadataItem для предоставления информации, связанной с видео.

Но если вам нужно иметь больше опций в меню проигрывателя, лучше создать UIViewController с пользовательской информацией и опцией настроек [в зависимости от ваших требований] и установить его как AVPlayerViewController customInfoViewController.

Это доступно из tvOS 11.0

enter image description here

Официальные документы Apple на это: Ссылка на Apple Docs

Ответ 5

К вашему сведению, я не мог заставить это появиться на симуляторе под управлением ОС 12.2 или 13 (бета). В итоге получилось добавить metadataItem.locale = NSLocale.current. Прокомментируйте это, это не появляется.