¿Alguna forma de cambiar el dispositivo de salida de sonido a través de Applescript o Shell?

Me gustaría cambiar el dispositivo de salida de sonido (como opción-clic en el ícono del altavoz en la barra de menú) a través de un script, pero NO a través de scripts de interfaz de usuario, por ejemplo, iniciando el panel de preferencias del sistema.

ACTUALIZACIÓN: Usando la solución @Mateusz a continuación, aquí hay un Applescript que, cuando se inicia, le dará una ventana emergente para seleccionar el dispositivo de salida de audio deseado:

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

(Nota: necesita poner el audiodevicearchivo en /Applications)

Respuestas (6)

Hay un audiodevicecomando disponible de whoshacks .

Uso:

  • audiodeviceenumerar los dispositivos de entrada, salida y audio del sistema
  • audiodevice <port>mostrar el dispositivo de audio para el puerto seleccionado
  • audiodevice <port> listenumerar los dispositivos de audio disponibles para el puerto seleccionado
  • audiodevice <port> <device>configurar el puerto seleccionado para usar el dispositivo designado ("interno" seleccionará altavoces internos o auriculares, lo que esté activo)
Parece que ha dejado de funcionar con Catalina debido a la caída de las aplicaciones de 32 bits.

Hay switchaudio-osx , comando que debe compilarse a partir de fuentes o puede instalarse a través de homebrew (se requiere instalación de Xcode):

brew install switchaudio-osx

Uso:

SwitchAudioSource [-a] [-c] [-t type] [-n] -s device_name
  • -a: muestra todos los dispositivos
  • -c: muestra el dispositivo actual
  • -t type: tipo de dispositivo (entrada/salida/sistema). Por defecto a la salida.
  • -n: cambia el dispositivo de audio al siguiente
  • -s device_name: establece el dispositivo de audio en el dispositivo dado por nombre
Estoy tratando de instalar esto usando homebrew brew install switchaudio-osxpero informa: ¿ 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. Alguna forma de evitar esto?
El procedimiento de compilación switchaudio-osxse basa en dependencias, etc. definidas en Xcode (la aplicación). Alguien que conozca Xcode mejor que yo probablemente podría extraerlos en un Makefile.
@Ze'ev O evalúa los riesgos involucrados y obtiene la versión que acabo de compilar de mi Dropbox dl.dropboxusercontent.com/u/3188370/SwitchAudioSource
@Ze'ev Creé un shellscript que automatiza la compilación/instalación descargando mas, luego xcode, luego switchaudio-osx. De esta manera, se beneficia del código fuente actualizado y no de un binario precompilado que potencialmente no es seguro o está desactualizado. Consulte: install-switchaudio.sh
brew install switchaudio-osx!
En mi Mac, la lista de dispositivos de salida no está sincronizada con lo que veo en la barra superior o en las preferencias de Sonido . Estoy usando Boom 3D que se incorpora al subsistema de sonido.
También disponible en macports www.macports.org .
sigo trabajando en monteray, gracias!
No tuve que hacer nada raro con xcode para instalar esto, en 2022 en Monterey. Así que intente hacer la instalación de preparación antes de preocuparse por las cosas de xcode.

Aquí hay un AppleScript para hacerlo con switchaudio-osx (simplemente reemplace XXXXXXX con el nombre del dispositivo que puede obtener al ejecutar "SwitchAudioSource -a"):

on run {input, parameters}

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

    return input
end run
Reemplacé la ruta para señalar /usr/local/binen lugar del directorio Homebrew versionado. De lo contrario, el script ya no funcionará si switchaudio-osxse actualiza.

Necesitaba un atajo de teclado para cambiar mi salida de sonido. Me gustó la simplicidad de las respuestas de AppleScript que he visto en los foros de Stack Exchange, pero no me gusta la idea de tener que codificar el nombre del dispositivo de salida/entrada que quiero. cambiar. Además, no pude encontrar una solución elegante para intercambiar entre 3 salidas de audio usando if-else. Sin mencionar si la fuente no siempre está en la lista de salida (por ejemplo, auriculares bluetooth).

Así que escribí lo siguiente que simplemente recorrerá todas las opciones y seleccionará la siguiente fuente en la lista / la primera fuente en la lista si se selecciona la última opción. Simplemente cambie la sourceToChangevariable de "Salida" a "Entrada" si desea crear otro script para intercambiar fuentes de micrófono. Una desventaja de este enfoque es que debe otorgar acceso a "Controlar su computadora" para cualquier aplicación que llame a este flujo de trabajo / acción rápida. Supongo que tiene algo que ver con llamar a la aplicación "Eventos del sistema", pero no estoy al 100% en eso. Tampoco estoy 100% seguro sobre la seguridad Sin embargo, espero que ayude a algunas personas. ¡Esto funciona para mi!


# 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

Para eliminar exactamente esta picazón, la switchaudio-osxutilidad se actualizó para admitir ahora el ciclo al siguiente dispositivo de audio. Después de instalar con homebrew, simplemente llame SwitchAudioSource -npara pasar al siguiente dispositivo. Esto evita la necesidad de un núcleo duro en los nombres de los dispositivos, pero también evita la necesidad de mantener complicadas interacciones de interfaz de usuario con secuencias de comandos en AppleScript.

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

Para instalar abrir terminal y ejecutarbrew install switchaudio-osx

Para enumerar todas las fuentes para la ejecución de entrada/salidaSwitchAudioSource -a

Esto producirá una salida similar a

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

Para cambiar el micrófono a un problema de micrófono externo siguiendo el comando

SwitchAudioSource -t input -s 'External Microphone'

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

Esta respuesta no es diferente de la respuesta más votada de Mateusz Szlosek

Hay una aplicación paga de aloe de $ 5 llamada Ears que hará el trabajo y se puede usar con la línea de comando https://retina.studio/ears/

Su respuesta podría mejorarse con información de apoyo adicional. Edite para agregar más detalles, como citas o documentación, para que otros puedan confirmar que su respuesta es correcta . Puede encontrar más información sobre cómo escribir buenas respuestas en el centro de ayuda .