Во встроенных приложениях для 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
Официальные документы Apple на это: Ссылка на Apple Docs
Ответ 5
К вашему сведению, я не мог заставить это появиться на симуляторе под управлением ОС 12.2 или 13 (бета). В итоге получилось добавить metadataItem.locale = NSLocale.current
. Прокомментируйте это, это не появляется.