代码之家  ›  专栏  ›  技术社区  ›  Vincent Gigandet

如何更改AVRoutePickerView的元数据?

  •  6
  • Vincent Gigandet  · 技术社区  · 8 年前

    enter image description here

    我的应用程序播放一些声音,我实现了AVRoutePickerView,这样它就可以通过AirPlay或蓝牙传输声音。

    一旦我点击AVRoutePickerView,上面的图像就会弹出,这是一张不错的图像,但图像和标题有误。

    图片和标题来自我之前玩过的苹果音乐应用程序。

    如何更改此元数据?

    我尝试过在没有运气的情况下配置MPNowPlayingFocenter。

    let albumArt = MPMediaItemArtwork(boundsSize:CGSize(width: 50, height: 50)) { sz in
        return UIImage(named: "MyImage")!
    }
    
    MPNowPlayingInfoCenter.default().nowPlayingInfo = [MPMediaItemPropertyTitle: "some title",
                                                   MPMediaItemPropertyArtist: "some artist",
                                                   MPMediaItemPropertyArtwork: albumArt]
    

    这就是我制作AVRoutePickerView的方式。

    import AVKit
    
    let routePickerView = AVRoutePickerView.init(frame: myFrame)
    routePickerView.backgroundColor = UIColor.clear
    routePickerView.tintColor = UIColor(named: someColor)
    routePickerView.activeTintColor = UIColor(named: someColor)
    soundController.contentView.addSubview(routePickerView)
    

    我的应用针对iOS11,并在iPhone 6和iPhone 7上进行测试。

    请引导我走正确的路。 谢谢

    1 回复  |  直到 8 年前
        1
  •  10
  •   David Mayes    8 年前

    >>更新(<)<
    除了使用MPNowPlayingInfoCenter对象提供正在播放的信息外,似乎还需要使用MPRemoteCommandCenter对象设置远程事件处理程序(即使未使用)。
    此外,在应用程序播放音频之前,当前播放的信息似乎不会更新。

    步骤:

    1、设置远程控制事件处理程序。
    在本例中,我只配置了pauseCommand,因为这是使当前播放信息正常工作所需的全部内容。

    func setupRemoteTransportControls() {
        // Get the shared MPRemoteCommandCenter
        let commandCenter = MPRemoteCommandCenter.shared()
    
        // Add handler for Pause Command
        commandCenter.pauseCommand.addTarget{ event in
               // Does nothing yet
               return .success
        }
    
    }
    


    2、使用MPNowPlayingFocenter对象配置当前播放信息。

    func setupNowPlayingInfo() {
    
        var nowPlayingInfo = [String : Any]()
        nowPlayingInfo[MPMediaItemPropertyTitle] = "My Song Title"
    
        if let image = UIImage(named: "MyImage") {
            nowPlayingInfo[MPMediaItemPropertyArtwork] =
                MPMediaItemArtwork(boundsSize: image.size) { size in return image }
        }
    
        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
    


    3、创建路由选择器视图控件。

    let routePickerView = AVRoutePickerView(frame: routView.bounds)
    routePickerView.backgroundColor = UIColor.clear
    routView.addSubview(routePickerView)
    


    4、播放音频并查看路由选择器。

    如果在播放应用程序音频之前查看路由选择器,则旧的“正在播放”信息将保留。

    希望现在可以了!



    旧答案
    您的实现看起来不错。唯一的查询是boundSize。它应该是艺术品的原始尺寸。 手册中写道:“请求处理程序以新请求的大小返回图像。请求的大小必须小于boundsSize参数。” 似乎大多数实现只返回原始大小。

    问题可能出在您的AVRoutePickerView实现上。 你能试着把它放在调度队列中吗?

    DispatchQueue.main.async { 
        let albumArt = MPMediaItemArtwork(boundsSize:CGSize(width: 50, height: 50)) 
                        { sz in return UIImage(named: "MyImage")!}
    
        MPNowPlayingInfoCenter.default().nowPlayingInfo = 
            [MPMediaItemPropertyTitle: "some title", 
             MPMediaItemPropertyArtist: "some artist", 
             MPMediaItemPropertyArtwork: albumArt]
    }
    

    在我的音频流应用程序中,当应用程序位于后台时,我提供元数据以在控制中心和iOS锁屏中显示。 我使用MPVolumeView,它有一个按钮用于选择音频输出路径(自动处理AVRoutePickerView的实例化和显示)。

    我的实施如下(按照手册):

    var nowPlayingInfo = [String : Any]()
    nowPlayingInfo[MPMediaItemPropertyTitle] = "Song Title"
    nowPlayingInfo[MPMediaItemPropertyArtist] = "Song Artist"
    
    if let image = UIImage(named: "SongImage") {
        nowPlayingInfo[MPMediaItemPropertyArtwork] =  MPMediaItemArtwork(boundsSize: image.size) { size in return image }
    }
    
    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo