使用 AVPlayer 从 MacOS Swift 应用程序将音频定向到 Air Play 扬声器

Directing Audio to Air Play Speakers from a MacOS Swift Application Using AVPlayer

我正在尝试将音频从我在 SWIFT 中编写的 MacOS 应用程序直接定向到无线播放扬声器。

我可以将音频定向到板载声音输出或 USB DAC 没问题。我可以获得连接的 USB DAC 的音频设备 ID,并在我的应用程序中将音频专门定向到该设备,但在使用 SWIFT/AVPLAYER.

播放扬声器时找不到好的 samples/docs

有人看过任何关于将音频从 macOS(不是 ios)swift 应用程序直接定向到 airplay 扬声器的好文档/代码示例吗?即如何获取 airplay 音频设备 ID 列表并从 avplayer 向它们发送输出?

为了将声音输出定向为 USB DAC,我可以使用此函数获得播放音频设备 ID 的列表 -

func getOutputDevices() -> [音频设备] {

print_log ("")
print_log("+++ START AUDIO PLAYBACK DEVICES FOUND....")
print_log ("")

for device in AudioDevice.allOutputDevices() {
    print("DEVICE NAME: " + device.name + " ->  DEVICE ID: " + String(device.uid ?? "Empty Device"))

}

print_log ("")
print_log("+++ END AUDIO PLAYBACK DEVICES FOUND....")
print_log ("")

return AudioDevice.allOutputDevices()

}

然后像这样使用 avplayer 并设置音频 audioOutputDeviceUniqueID 向其中一个返回的音频设备播放音频 -

print_log("Setting audio output device to " + String(playback_device.uid ?? "Empty"))


gbl_queue_player.audioOutputDeviceUniqueID=playback_device.uid


gbl_queue_player.addObserver(stage, forKeyPath: "status", options: NSKeyValueObservingOptions.new, context: nil)
gbl_queue_player.addObserver(stage, forKeyPath: "rate", options: NSKeyValueObservingOptions.new, context: nil)
gbl_queue_player.addObserver(stage, forKeyPath:"currentItem", options:NSKeyValueObservingOptions.new, context:nil)


gbl_queue_player.play()

我希望一切都有意义。我找到了一些关于 IOS 但不是 MacOS.

的文档

谢谢!

编辑 2020 年 1 月 7 日

尝试使用下面的代码在按下按钮时实例化 AVRoutePicker。

好消息:选择器出现并且内置扬声器列为选项。

坏消息:我的系统上没有确认的 airplay 设备或 USB DAC 以这种方式显示,但它们在 OS' 声音选择器中显示。

@IBAction func airplay_button_clicked(_ 发件人:任意)

{

let frame = CGRect(x: 50, y: 50, width: 100, height: 50)

gbl_routePickerView = AVRoutePickerView(frame: frame)

view.addSubview(gbl_routePickerView)}

}

此应用程序没有沙盒。

*** 编辑解决方案 01/06/2020

正如 Jon 所指出的,必须将玩家分配给路线选择玩家 属性

所以我的功能变成了....

@IBAction func airplay_button_clicked(_ 发件人:任何) {

    print_log("Airplay button clicked")

    let frame = CGRect(x: 50, y: 50, width: 100, height: 50)



    if #available(OSX 10.15, *) {
        gbl_routePickerView = AVRoutePickerView(frame: frame)
        gbl_routePickerView.player=gbl_queue_player
        view.addSubview(gbl_routePickerView)

    } else {
        // Fallback on earlier versions
        print_log("OS Does not support avroute picker.")
    }

}

在您的视图层次结构中实例化一个 AVRoutePickerView,然后将您的 AVPlayer 实例分配给 AVRoutePickerViewplayer 属性。然后,您将有一个 GUI,用于为您的 AVPlayer.

选择 AirPlay 路由