如何通过 CarPlay 音频应用程序中的实时 URL 集成音频

Posted

技术标签:

【中文标题】如何通过 CarPlay 音频应用程序中的实时 URL 集成音频【英文标题】:How do i integrate audio through live URL in CarPlay Audio App 【发布时间】:2021-08-03 09:53:22 【问题描述】:

我想将音频集成到 carplay 应用程序。 我已经用 CPListItems 创建了一个 CPListTemplate,点击它,我正在推送一个正在播放的模板。 音频似乎没有播放,我无法与正在播放的屏幕互动。

问题:

    如何将音频 URl 传递给正在播放的模板,以便它至少可以播放声音? 如何与播放器交互并在屏幕上显示专辑插图和文字?

注意:我正在模拟器上对此进行测试,并且我有 mp3 格式的音频 URL。

     var listItems: [CPListItem] = []
     for playListItem in PlayListItems 
          let item = CPListItem(text: playListItem.title, detailText: "")
          item.handler = listItem, completion in 
          let nowPlayingTemplate = CPNowPlayingTemplate.shared
          nowPlayingTemplate.add(self)
          nowPlayingTemplate.isAlbumArtistButtonEnabled = true
          self.interfaceController?.pushTemplate(nowPlayingTemplate, animated: true)
          
      listItems.append(item)
     
     let sectionPlayList = CPListSection(items: listItems)
     self.interfaceController?.pushTemplate(CPListTemplate(title: “Tab 1”, sections: [sectionPlayList]), animated: true)   

【问题讨论】:

嗨Shashant,你能发布一些你尝试过的代码吗?您的应用是否会在 CarPlay 之外的设备上播放音频并显示图片? 嗨,我已经添加了部分实现。 PlaylistItem 对象具有 mp3 格式的音频文件和一些其他详细信息,例如标题和专辑图像。我不确定我们是否必须将音频 url 传递给 nowplaying 对象才能开始播放声音。 Truptika 的回答应该有效。请注意,CarPlay 音频模板仅负责您应用的 UI 元素。您需要使用 AVPlayer 或其他音频库来处理播放。 是的,肖恩,这行得通。谢谢! 【参考方案1】:
    如何将音频 URl 传递给正在播放的模板,以便它至少可以播放声音?

没有办法在正在播放的模板中传递 url。使用 AVPlayer 播放音频 url。在项目处理程序上添加 setPlayer() 方法并传递您的音频 url 代替“stationUrl”。

var player = AVPlayer()
func setPlayer() 
      let playerItem = AVPlayerItem(url: URL(string: stationUrl)!)
      player = AVPlayer(playerItem: playerItem)
      player.rate = 1.0
      player.play()
      self.setPlayerNowPlayingInformation()
  
    如何与播放器交互并在屏幕上显示专辑插图和文字?

在 MPNowPlayingInfoCenter 中的正在播放模板集媒体信息中显示专辑封面图像和文本。

func setPlayerNowPlayingInformation() 
      var nowPlayingInfo: [String: Any] = [:]
                
      nowPlayingInfo = [MPMediaItemPropertyTitle: "Media Title"]
                
      if let image = UIImage (named: "carplay_app_icon") 
         nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size, requestHandler:  size -> UIImage in
             return image
          )
                
      MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo

【讨论】:

感谢@truptika,这有帮助。我能够播放声音,而且专辑插图也设置在 carplay 屏幕上。虽然模拟器上的行为有点奇怪,但第一次屏幕不是交互式的,但第二次会在下一次之后被激活。 @Shashant - CarPlay 模拟器可靠性不高,存在此类问题。但是,当您说非交互式并被激活时,您指的是哪些控件或 UI 元素? 第一次推送到正在播放的模板时,音频开始在后台播放,模板是非交互式的,当我返回列表并再次推送模板时,正在播放模板变得互动,我可以播放/暂停音频。

以上是关于如何通过 CarPlay 音频应用程序中的实时 URL 集成音频的主要内容,如果未能解决你的问题,请参考以下文章

添加 CarPlay 用户界面

使用 CarPlay 框架的 CarPlay 应用在 iOS 13 或更早版本上崩溃

Qt 通过 TCP 套接字实时流式传输音频

何时在 CarPlay 中使用 beginUpdates() 和 endUpdates()

如何实时流式传输音频文件

MPPlayableContentDataSource 调用不一致