AVPlayerViewController投屏AirPlay时无法显示MPMediaItemPropertyArtwork
AirPlay投屏音频时显示专辑封面(保持allowsExternalPlayback=true)
问题场景
- 使用
AVPlayerViewController播放音频,通过其contentOverlayView上的UIImageView展示专辑封面 - 已配置
MPNowPlayingInfoCenter的nowPlayingInfo,iOS控制中心可正常显示所有信息 - 通过
AVPlayerViewController内置AirPlay按钮投屏到外部电视时,音频仅显示标题和带播放控件的黑屏,无专辑封面;视频投屏正常 - 尝试设置
playerController?.player?.allowsExternalPlayback = false后,控制中心触发AirPlay能显示封面,但视频无法投屏,且AVPlayer的AirPlay按钮被隐藏,不符合需求
解决方案
当allowsExternalPlayback=true时,AirPlay设备会优先读取AVPlayerItem的元数据而非MPNowPlayingInfoCenter的内容,因此需要为音频类型的AVPlayerItem直接添加封面元数据,同时保留原有的nowPlayingInfo设置以保证控制中心正常显示。
实现代码
- 封装添加封面元数据的方法:
private func addArtworkMetadata(to playerItem: AVPlayerItem, with image: UIImage) { guard let cgImage = image.cgImage else { return } let artworkItem = AVMutableMetadataItem() artworkItem.identifier = AVMetadataIdentifier.commonIdentifierArtwork artworkItem.value = CGImagePropertyCreateWithImage(cgImage, nil) as AnyObject artworkItem.extendedLanguageTag = "und" // 通用语言标识 var metadata = playerItem.externalMetadata metadata.append(artworkItem) playerItem.externalMetadata = metadata }
- 创建音频
AVPlayerItem时调用该方法:
// 示例:初始化音频PlayerItem并添加封面 if let audioURL = URL(string: "你的音频地址") { let audioItem = AVPlayerItem(url: audioURL) if let albumImage = imageView?.image { // 复用已有的封面图片 addArtworkMetadata(to: audioItem, with: albumImage) } playerController?.player = AVPlayer(playerItem: audioItem) }
- 保留原有的
setupNowPlaying()方法,确保控制中心和锁屏显示正常。
效果验证
- 保持
allowsExternalPlayback=true,AVPlayerViewController的AirPlay按钮正常显示 - 音频投屏到外部电视时,会显示专辑封面、标题等信息
- 视频投屏功能不受影响,可正常播放画面
内容的提问来源于stack exchange,提问作者Simon McLoughlin
相关产品推荐
相关产品推荐

