使用 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
实例分配给 AVRoutePickerView
的 player
属性。然后,您将有一个 GUI,用于为您的 AVPlayer
.
选择 AirPlay 路由
我正在尝试将音频从我在 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
实例分配给 AVRoutePickerView
的 player
属性。然后,您将有一个 GUI,用于为您的 AVPlayer
.