Направление звука на динамики Air Play из приложения MacOS Swift с помощью AVPlayer - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь направить звук из приложения MacOS, которое я написал в SWIFT, прямо на динамики с эфирным воспроизведением.

Я могу направить звук на встроенные звуковые выходы или сказать USB DA C без проблем. Я могу получить идентификаторы аудиоустройств, скажем, для подключенного USB DA C, и направить звук специально для этого штрафа в моем приложении, но у меня возникли проблемы с поиском хороших образцов / документов, чтобы сделать это для динамиков трансляции с помощью SWIFT / AVPLAYER.

Кто-нибудь видел какие-либо хорошие документы / образцы кода по направлению звука из быстрого приложения macOS (не ios) напрямую к динамикам трансляции? то есть, как получить список идентификаторов аудиоустройств трансляции и отправить на них вывод из avplayer?

Для направления вывода звука, скажем, USB DA C Я могу получить список идентификаторов воспроизводящих аудиоустройств с помощью этой функции -

fun c 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-ЦАП в моей системе показывают это так, но они есть в ОС выбор звука.

@ IBAction fun c airplay_button_clicked (_ sender: Any)

{

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

gbl_routePickerView = AVRoutePickerView (frame: frame)

view.addSubview (gbl_routePickerView)}

}

В этом приложении нет песочницы.

*** РЕДАКТИРОВАТЬ РЕШЕНИЕ 01/06/2020

Как указано Джоном, игрок должен быть назначен свойству выбора маршрута

, поэтому функция для меня стала ....

@ IBAction fun c airplay_button_clicked (_ sender: Any) {

    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.")
    }

}

1 Ответ

0 голосов
/ 01 июня 2020

Создайте экземпляр AVRoutePickerView в своей иерархии представлений, затем назначьте свой AVPlayer экземпляр свойству AVRoutePickerView s player. После этого у вас будет GUI для выбора маршрута (ов) AirPlay для вашего AVPlayer.

...