AVPlayer 元数据插图不显示在 tvOS 上
AVPlayer metadata artwork does not show on tvOS
我正在尝试在 AVPlayerController 下拉菜单中显示信息。我完全遵循他们在 WWDC 中展示的内容,将元数据添加到 playerItem。一切都显示正常,除了艺术品图像。奇怪的是,它似乎将图像添加到信息视图中,但随后将其隐藏。有一个 space 图像应该在的位置,但没有显示。它确实出现在电视远程应用程序上,所以我知道我添加它是正确的。这是我的代码:
let playerItem: AVPlayerItem = AVPlayerItem(asset: avasset)
var allItems: [AVMetadataItem] = []
allItems.append(self.metadataItem(identifier: AVMetadataCommonIdentifierTitle, value: asset.title as (NSCopying & NSObjectProtocol)?)!)
if let desc = asset.desc {
allItems.append(self.metadataItem(identifier: AVMetadataCommonIdentifierDescription, value: desc as (NSCopying & NSObjectProtocol)?)!)
}
if let image = self.thumbImage, let artworkItem = self.metadataArtworkItem(image: image) {
allItems.append(artworkItem)
}
playerItem.externalMetadata = allItems
self.setupPlayerItem(playerItem)
用于创建元数据项的方法:
func metadataItem(identifier: String, value: (NSCopying & NSObjectProtocol)?) -> AVMetadataItem? {
if let actualValue = value {
let item = AVMutableMetadataItem()
item.value = actualValue
item.identifier = identifier
item.extendedLanguageTag = "und"
return item.copy() as? AVMetadataItem
}
return nil
}
func metadataArtworkItem(image: UIImage) -> AVMetadataItem? {
let item = AVMutableMetadataItem()
item.value = UIImagePNGRepresentation(image) as (NSCopying & NSObjectProtocol)?
item.dataType = kCMMetadataBaseDataType_PNG as String
item.identifier = AVMetadataCommonIdentifierArtwork
item.extendedLanguageTag = "und"
return item.copy() as? AVMetadataItem
}
所以事实证明,如果 AVMetadataCommonIdentifierDescription
项为 nil 或空字符串,图像将被隐藏。如果没有要显示的文本,我所要做的就是将描述设置为“”来修复它。我将就此向 apple 提交错误,因为这显然不正常。
不确定几年前围绕这个问题发生了什么,但现在的问题是,如果您不将图像转换为 pngData
,图像将不会显示。换句话说,仅向 Artwork 项目发送 UIImage 是行不通的。所以每个 Apple 都需要像这样:
if let showImage = image, let pngData = showImage.pngData() {
let imageItem = self.makeMetadataItem(AVMetadataIdentifier.commonIdentifierArtwork.rawValue, value: pngData)
metadata.append(imageItem)
}
我正在尝试在 AVPlayerController 下拉菜单中显示信息。我完全遵循他们在 WWDC 中展示的内容,将元数据添加到 playerItem。一切都显示正常,除了艺术品图像。奇怪的是,它似乎将图像添加到信息视图中,但随后将其隐藏。有一个 space 图像应该在的位置,但没有显示。它确实出现在电视远程应用程序上,所以我知道我添加它是正确的。这是我的代码:
let playerItem: AVPlayerItem = AVPlayerItem(asset: avasset)
var allItems: [AVMetadataItem] = []
allItems.append(self.metadataItem(identifier: AVMetadataCommonIdentifierTitle, value: asset.title as (NSCopying & NSObjectProtocol)?)!)
if let desc = asset.desc {
allItems.append(self.metadataItem(identifier: AVMetadataCommonIdentifierDescription, value: desc as (NSCopying & NSObjectProtocol)?)!)
}
if let image = self.thumbImage, let artworkItem = self.metadataArtworkItem(image: image) {
allItems.append(artworkItem)
}
playerItem.externalMetadata = allItems
self.setupPlayerItem(playerItem)
用于创建元数据项的方法:
func metadataItem(identifier: String, value: (NSCopying & NSObjectProtocol)?) -> AVMetadataItem? {
if let actualValue = value {
let item = AVMutableMetadataItem()
item.value = actualValue
item.identifier = identifier
item.extendedLanguageTag = "und"
return item.copy() as? AVMetadataItem
}
return nil
}
func metadataArtworkItem(image: UIImage) -> AVMetadataItem? {
let item = AVMutableMetadataItem()
item.value = UIImagePNGRepresentation(image) as (NSCopying & NSObjectProtocol)?
item.dataType = kCMMetadataBaseDataType_PNG as String
item.identifier = AVMetadataCommonIdentifierArtwork
item.extendedLanguageTag = "und"
return item.copy() as? AVMetadataItem
}
所以事实证明,如果 AVMetadataCommonIdentifierDescription
项为 nil 或空字符串,图像将被隐藏。如果没有要显示的文本,我所要做的就是将描述设置为“”来修复它。我将就此向 apple 提交错误,因为这显然不正常。
不确定几年前围绕这个问题发生了什么,但现在的问题是,如果您不将图像转换为 pngData
,图像将不会显示。换句话说,仅向 Artwork 项目发送 UIImage 是行不通的。所以每个 Apple 都需要像这样:
if let showImage = image, let pngData = showImage.pngData() {
let imageItem = self.makeMetadataItem(AVMetadataIdentifier.commonIdentifierArtwork.rawValue, value: pngData)
metadata.append(imageItem)
}