如何更改AVRoutePickerView的元数据?

时间:2018-04-26 20:15:44

标签: ios swift swift4 mpvolumeview mpnowplayinginfocenter

enter image description here

我的应用播放了一些声音,我实现了AVRoutePickerView,因此它可以通过AirPlay或蓝牙传输声音。

点击AVRoutePickerView后,会弹出上面的图像,但图像和标题错误。

图片和标题来自我以前玩过的Apple Music应用程序。

如何更改此元数据?

我尝试过没有运气配置MPNowPlayingInfoCenter。

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 个答案:

答案 0 :(得分:4)

<强>&GT;&GT;更新&lt;&lt;
除了使用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。使用MPNowPlayingInfoCenter对象配置正在播放信息。

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