Есть ли способ изменить устройство вывода звука через Applescript или оболочку?

Я хотел бы изменить устройство вывода звука (например, щелкнув значок динамика в строке меню) с помощью сценария, но НЕ с помощью сценариев пользовательского интерфейса, например, запуска панели System Pref.

ОБНОВЛЕНИЕ: используя приведенное ниже решение @Mateusz, вот Applescript, который при запуске предоставит вам всплывающее окно для выбора желаемого устройства вывода звука:

set devices to do shell script "/Applications/Audiodevice/audiodevice output list"
set answer to choose from list (paragraphs of devices) with title "Audio Output" with prompt "Select a device" without multiple selections allowed
if answer is false then return
do shell script "/Applications/Audiodevice/audiodevice output " & quoted form of item 1 of answer

(Примечание: вам нужно поместить audiodeviceфайл в /Applications)

Ответы (6)

Есть audiodeviceкоманда, доступная от whoshacks .

Использование:

  • audiodeviceсписок устройств для ввода, вывода и системного звука
  • audiodevice <port>отобразить аудиоустройство для выбранного порта
  • audiodevice <port> listсписок доступных аудиоустройств для выбранного порта
  • audiodevice <port> <device>установите выбранный порт для использования назначенного устройства («внутренний» выберет внутренние динамики или наушники, в зависимости от того, что активно)
Кажется, он перестал работать под Catalina из-за отказа от 32-битных приложений.

Есть команда switchaudio-osx , которую необходимо скомпилировать из исходников или установить через homebrew (требуется установка Xcode):

brew install switchaudio-osx

Использование:

SwitchAudioSource [-a] [-c] [-t type] [-n] -s device_name
  • -a: показывает все устройства
  • -c: показывает текущее устройство
  • -t type: тип устройства (ввод/вывод/система). По умолчанию для вывода.
  • -n: переключает аудиоустройство на следующее
  • -s device_name: устанавливает аудиоустройство на данное устройство по имени
Я пытаюсь установить это с помощью доморощенного, brew install switchaudio-osxно он сообщает: switchaudio-osx: A full installation of Xcode.app is required to compile this software. Installing just the Command Line Tools is not sufficient. Xcode can be installed from the App Store. Error: An unsatisfied requirement failed this build. как-нибудь обойти это?
Процедура сборки switchaudio-osxзависит от зависимостей и т. д., определенных в Xcode (приложении). Кто-то, кто разбирается в Xcode лучше меня, вероятно, сможет извлечь их в Makefile.
@Ze'ev Или вы оцениваете связанные с этим риски и получаете версию, которую я только что скомпилировал, из своего Dropbox dl.dropboxusercontent.com/u/3188370/SwitchAudioSource .
@Ze'ev Я сделал сценарий оболочки, который автоматизирует компиляцию/установку путем загрузки mas, затем xcode, а затем switchaudio-osx. Таким образом, вы получаете выгоду от обновленного исходного кода, а не от предварительно скомпилированного бинарного файла, который потенциально небезопасен или устарел. См.: install-switchaudio.sh
brew install switchaudio-osx!
На моем Mac список устройств вывода не синхронизирован с тем, что я вижу на верхней панели или в настройках звука . Я использую Boom 3D, который встраивается в звуковую подсистему.
Также доступно на сайте macports www.macports.org .
все еще работаю в Монтерее, спасибо!
Мне не пришлось делать никаких странных вещей с xcode, чтобы установить это в 2022 году в Монтерее. Поэтому попробуйте выполнить установку brew, прежде чем беспокоиться о вещах xcode.

Вот AppleScript, чтобы сделать это с помощью switchaudio-osx (просто замените XXXXXXX на имя устройства, которое вы можете получить, выполнив «SwitchAudioSource -a»):

on run {input, parameters}

    do shell script "/usr/local/bin/SwitchAudioSource -s 'XXXXXXXX'"

    return input
end run
Я заменил путь, на который нужно указать, /usr/local/binвместо версии каталога Homebrew. В противном случае скрипт больше не будет работать, если switchaudio-osxбудет обновлен.

Мне нужно было сочетание клавиш для изменения вывода звука — мне понравилась простота ответов AppleScript, которые я видел на форумах Stack Exchange, но мне не нравится идея жесткого кодирования имени устройства вывода/ввода, которое я хочу изменить. Также я не смог найти элегантного решения для переключения между тремя аудиовыходами с помощью if-else. Не говоря уже о том, что источник не всегда находится в списке вывода (например, наушники Bluetooth).

Поэтому я написал ниже, который просто перебирает все параметры и выбирает следующий источник в списке/первый источник в списке, если выбран последний вариант. Просто измените sourceToChangeпеременную с «Выход» на «Вход», если вы хотите создать еще один скрипт для переключения источников микрофона. Одним из недостатков этого подхода является то, что вы должны предоставить доступ «Управление своим компьютером» для любого приложения, которое вызывает этот рабочий процесс / быстрое действие. Я предполагаю, что это как-то связано с вызовом приложения «Системные события», но я не уверен в этом на 100%. Также не уверен на 100% в безопасности. Тем не менее, я надеюсь, что это поможет некоторым людям. Меня устраивает!


# loop thru all sound outputs in "System Preferences" > "Sound" > "Output"/"Input"

on run {input, parameters}
    
    set sourceToChange to "Output" # change me to "Input" or "Output"!
    
    tell application "System Preferences"
        run
        set current pane to pane "com.apple.preference.sound"
        
    end tell
    
    tell application "System Events"
        
        tell application process "System Preferences"
        
            repeat until exists tab group 1 of window "Sound" # prevent script from executing before Sound load
            
            end repeat
            
            tell tab group 1 of window "Sound"
                
                click radio button sourceToChange
                set soundOutputs to a reference to every row of table 1 of scroll area 1
                set activateSound to false
                set exitMe to false
                
                repeat with i from 1 to count of soundOutputs
                    
                    if activateSound is true then
                        
                        set exitMe to true
                        set selected of row i of table 1 of scroll area 1 to true
                        
                        # if attempted to set the line break before AirPlay devices to true, set the first row to true and exit
                        if (not selected of row i of table 1 of scroll area 1) then
                            set selected of row 1 of table 1 of scroll area 1 to true
                            
                        end if
                        
                    end if
                    
                    if (selected of row i of table 1 of scroll area 1) and (activateSound is false) and (exitMe is false) then
                        set activateSound to true
                        
                    end if
                    
                    if exitMe is true then
                        return
                        
                    end if
                    
                end repeat
                
                # Input doesn't suffer from the AirPlay linebreak issue so this catches an attempt to exit at the last row before setting selected to the first item
                set selected of row 1 of table 1 of scroll area 1 to true
                
            end tell
        end tell
    end tell
end run

Чтобы избавиться именно от этого зуда, switchaudio-osxутилита была обновлена ​​и теперь поддерживает циклическое переключение на следующее аудиоустройство. После установки с помощью homebrew просто позвоните SwitchAudioSource -n, чтобы перейти к следующему устройству. Это позволяет избежать необходимости жесткого ввода имен устройств, а также избавляет от необходимости поддерживать сложные сценарии взаимодействия с пользовательским интерфейсом в AppleScript.

https://github.com/deweller/switchaudio-osx

Чтобы установить открытый терминал и запуститьbrew install switchaudio-osx

Чтобы перечислить все источники для ввода/вывода, выполнитеSwitchAudioSource -a

Это приведет к выводу, аналогичному

External Microphone (input)
MacBook Pro Microphone (input)
External Headphones (output)
MacBook Pro Speakers (output)

Чтобы переключить микрофон на внешний микрофон, выполните следующую команду

SwitchAudioSource -t input -s 'External Microphone'

https://appsnomad.com/blog/how-to-change-audio-output-input-from-terminal-in-osx/3

Этот ответ ничем не отличается от ответа Матеуша Шлосека , получившего наибольшее количество голосов.

Существует алоэ, платное приложение Ears за 5 долларов, которое сделает эту работу и может использоваться с командной строкой https://retina.studio/ears/.

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре .