You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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设置以保证控制中心正常显示。

实现代码

  1. 封装添加封面元数据的方法:
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
}
  1. 创建音频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)
}
  1. 保留原有的setupNowPlaying()方法,确保控制中心和锁屏显示正常。

效果验证

  • 保持allowsExternalPlayback=true,AVPlayerViewController的AirPlay按钮正常显示
  • 音频投屏到外部电视时,会显示专辑封面、标题等信息
  • 视频投屏功能不受影响,可正常播放画面

内容的提问来源于stack exchange,提问作者Simon McLoughlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:01:19