[我试图将来自我在SWIFT中编写的MacOS应用程序中的音频直接定向到空中播放扬声器。
我可以将音频定向到板载声音输出,或者说USB DAC没问题。我可以说出已连接的USB DAC的音频设备ID,并且可以在应用程序中直接将音频定向到特定的水平,但很难找到使用SWIFT / AVPLAYER播放扬声器的好的样本/文档。
[有人看到任何将macOS(非ios)快速应用程序中的音频直接定向到airplay扬声器的好文档/代码示例吗?即如何获取airplay音频设备ID的列表并从avplayer发送输出到它们?
为了将声音输出说成USB DAC,我可以使用此功能获得播放音频设备ID的列表-
func getOutputDevices()-> [AudioDevice] {
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的。
谢谢!
编辑01/07/2020
尝试一下下面的代码,以在按下按钮时实例化AVRoutePicker。
好消息:出现选择器,并且列出了内置扬声器作为选项。
坏消息:我系统上没有经过确认的播放设备或USB DAC会以这种方式显示,但它们在操作系统的声音选择器中会显示。
@@ IBAction func airplay_button_clicked(_发件人:任何)
{
让框架= CGRect(x:50,y:50,宽度:100,高度:50)
gbl_routePickerView = AVRoutePickerView(帧:帧)
view.addSubview(gbl_routePickerView)}
}
此应用程序上没有沙箱。
***编辑解决方案01/06/2020
如乔恩所指出,必须将一个玩家分配给路线选择器玩家属性
所以对我来说功能变成了....
@ 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路线。