fl2d
V2EX  ›  Apple

macOS 下,能用快捷键切换音频输出设备么?

  •  
  •   fl2d · Nov 22, 2022 · 3404 views
    This topic created in 1373 days ago, the information mentioned may be changed or developed.

    比如用键盘快捷键切换 内置音箱 /耳机 /蓝牙音箱。

    29 replies    2026-08-26 16:00:51 +08:00
    zhaoxin
        1
    zhaoxin  
       Nov 22, 2022
    你可以尝试写 shortcuts 或者 applescript ,然后绑定快捷键。不过其实这个意义也不大。你把音量图标拖到定栏用鼠标点不是一样吗?
    hackpro
        2
    hackpro  
       Nov 22, 2022 via iPhone
    Alfred workflow
    fl2d
        3
    fl2d  
    OP
       Nov 22, 2022
    @zhaoxin 有特殊需求,需要频繁在耳际与音响之间切换🤦 手点太麻烦
    jheroy
        5
    jheroy  
       Nov 22, 2022
    如果不想用 Alfred, 也可以吧上面那个 worklfow 中间的脚本复制过来配合 skhd 直接用快捷键直接那个脚本就切换了, 参数直接写上你的输出设备就行.
    jheroy
        6
    jheroy  
       Nov 22, 2022
    直接那个脚本 = 执行那个脚本
    fl2d
        7
    fl2d  
    OP
       Nov 22, 2022   ❤️ 1
    @zhaoxin @hackpro @jheroy
    我用下面这个命令行工具,配合 karabiner 实现了。
    https://github.com/deweller/switchaudio-osx
    arac
        8
    arac  
       Nov 22, 2022
    也有这个需求,raycast 的官方 repo 找的 swift 脚本改的,配上 alias 也挺好用的
    dufu1991
        9
    dufu1991  
       Nov 23, 2022
    @fl2d 装好了 switchaudio-osx ,在终端直接运行没问题,但是我尝试通过『自动操作』将 SwitchAudioSource -n 这个命令配置一个全局的快捷键,发现『自动操作』里面执行 shell 命令的时候找不到 SwitchAudioSource 这个命令,奇怪。导致快捷键这个最核心的步骤过不去,你们是如何解决的?
    fl2d
        10
    fl2d  
    OP
       Nov 23, 2022   ❤️ 1
    @dufu1991
    加路径,/usr/local/bin/SwitchAudioSource
    dufu1991
        11
    dufu1991  
       Nov 23, 2022
    @fl2d 命令不是很熟,能否详细点。我试了 cd /usr/local/bin/,然后 SwitchAudioSource -n 。还是不行。
    fl2d
        12
    fl2d  
    OP
       Nov 24, 2022 via iPhone
    @dufu1991
    在你的脚本里,命令的前面,加上路径 /usr/local/bin/SwitchAudioSource -n xxx

    这个是我这里的路径,你可以用 which SwitchAudioSource 看一下你电脑里的路径
    19cm
        13
    19cm  
       Jan 25
    老哥你实现了吗,lua 脚本我倒是实现了,但快捷指令没搞定



    -- Hammerspoon: 切换音频输出设备( Headsets <-> Yamaha YVC-330 )
    -- 将本文件保存为 ~/.hammerspoon/init.lua ,Reload Config 后按 F12 切换

    -- 定义要切换的两个设备
    local DEVICES = {
    {name = "Headsets", icon = "🎧"}, -- 耳机
    {name = "Yamaha YVC-330", icon = "🔈"} -- 雅马哈设备
    }

    -- 获取所有音频设备
    local function getAllAudioDevices()
    local devices = {}
    for _, dev in ipairs(hs.audiodevice.allOutputDevices()) do
    devices[dev:name()] = dev
    end
    return devices
    end

    -- 切换音频设备
    local function toggleAudioOutput()
    local allDevices = getAllAudioDevices()

    -- 检查两个设备是否都存在
    local device1 = allDevices[DEVICES[1].name]
    local device2 = allDevices[DEVICES[2].name]

    if not device1 or not device2 then
    hs.alert.show("❌ 找不到音频设备")
    return
    end

    -- 获取当前设备
    local current = hs.audiodevice.defaultOutputDevice()

    -- 决定切换到哪个设备
    local target = nil
    local targetIcon = ""

    if current and current:name() == DEVICES[1].name then
    target = device2
    targetIcon = DEVICES[2].icon
    else
    target = device1
    targetIcon = DEVICES[1].icon
    end

    -- 执行切换
    if target:setDefaultOutputDevice() then
    hs.alert.show(targetIcon .. " 已切换至: " .. target:name())
    else
    hs.alert.show("❌ 切换失败")
    end
    end




    -- hs.hotkey.bind({"ctrl"}, "f1", toggleAudioOutput)

    -- 绑定热键 F12 (没有修饰键)
    hs.hotkey.bind({}, "f13", toggleAudioOutput)

    -- 加载提示
    print("🎧 音频切换脚本已加载")
    print("📢 按 F12 切换设备:")
    for i, device in ipairs(DEVICES) do
    print(" " .. i .. ". " .. device.icon .. " " .. device.name)
    end
    hanguokai
        14
    hanguokai  
       1 day ago
    @19cm 我前几天自己做了一个快捷键切换音频设备的 App ,简单易用 https://apps.apple.com/app/hotkey-audio-switcher/id6802059852
    19cm
        15
    19cm  
       1 day ago
    @hanguokai 链接有问题 直接发下 app 名字吧
    hanguokai
        16
    hanguokai  
       1 day ago
    @19cm App Store 上搜索 Hotkey Audio Switcher 。那个链接在电脑浏览器上打开没问题。
    19cm
        17
    19cm  
       16h 27m ago
    @hanguokai #16 建议改下, 切换快捷键 应该要能绑定单个 f 区按键, 比如 f12 f13 这种
    hanguokai
        18
    hanguokai  
       8h 52m ago
    @19cm 它的功能类似于 cmd+tab 的效果,在*多个*设备之间连续进行选择,松手就选中切换。单键无法实现(最多只能切换到下一个设备)。
    19cm
        19
    19cm  
       7h 27m ago
    @hanguokai #16 本来就是切换到下一个就行啊
    hanguokai
        20
    hanguokai  
       7h 16m ago
    @19cm 实际上可能会有多个,不仅仅是 2 个,所以快捷键的功能准确的说是在多个设备之间循环选择的。比如说有 3 个,下一个可能不是你期望的设备。
    19cm
        21
    19cm  
       7h 11m ago
    @hanguokai #20 所以要有排除设备的名单啊,比如 5 个设备,排除掉三个, 剩下的不就是在两个来回切了,f 区切是最方便点的,另外还要有记忆功能最好, 比如笔记本在家里 是哪几个设备,在公司又是哪几个设备
    hanguokai
        22
    hanguokai  
       6h 58m ago
    @19cm 通用软件要考虑所有人的情况,不能假设所有人都只有 2 个输出设备(或者是通过排除选项达成仅剩 2 个)。设置选项是有记忆的,无论是家里还是公司排除的设备都是记住的。
    19cm
        23
    19cm  
       6h 21m ago
    @hanguokai #22 这不是很简单吗,你多个设置选项不就行行了, 一个快捷键顺序切换, 一个按你原来的
    hanguokai
        24
    hanguokai  
       6h 5m ago
    @19cm 可以是可以,但是现有的快捷键功能也是按一下就切换到下一个设备。区别仅仅是组合快捷键和单键的区别。
    19cm
        25
    19cm  
       4h 56m ago
    @hanguokai #24 所以你放开单键就行了啊
    19cm
        26
    19cm  
       4h 54m ago
    @hanguokai #24 另外可以多加两个可配置快捷键项, 或者可以客户无限自己定义加,比如一个键快速 1 号二级,一个键切 3 号音响
    这样灵活性高很多
    hanguokai
        27
    hanguokai  
       4h 15m ago
    @19cm 类似操作系统 cmd+tab 这种功能单键是实现不了的,所以不允许单键。不松开 cmd 时再次按下 tab 键可以连续切换到下一个,一旦松开 cmd 键就取消悬浮窗口并执行切换。这里至少靠 2 个键才实现的。
    19cm
        28
    19cm  
       3h 21m ago
    @hanguokai #27 为啥要类似 cmd+tab, 我自己写脚本都实现了单键切换
    -- 二进制路径
    set bin to "/opt/homebrew/bin/SwitchAudioSource"

    -- 设备定义
    set device1 to "EarPods"
    set icon1 to "🎧"

    set device2 to "Yamaha YVC-330"
    set icon2 to "🔈"

    -- 获取当前设备 & 所有设备
    set currentDevice to do shell script bin & " -c -t output"
    set allDevices to do shell script bin & " -a -t output"

    -- 判断存在性
    set hasDevice1 to allDevices contains device1
    set hasDevice2 to allDevices contains device2

    -- ❌ 两个都不存在
    if (not hasDevice1) and (not hasDevice2) then
    display notification icon1 & " " & device1 & " 未连接 / " & icon2 & " " & device2 & " 未连接,暂不切换"
    return
    end if

    -- ⚠️ 只存在 device1 ( device2 未连接)
    if hasDevice1 and (not hasDevice2) then
    do shell script bin & " -s " & quoted form of device1
    display notification icon2 & device2 & " 未连接,已切换至" & icon1 & " " & device1
    return
    end if

    -- ⚠️ 只存在 device2 ( device1 未连接)
    if hasDevice2 and (not hasDevice1) then
    do shell script bin & " -s " & quoted form of device2
    display notification icon1 & " " & device1 & " 未连接,已切换至" & icon2 & " " & device2
    return
    end if

    -- ✅ 两个都存在 → 正常切换
    if currentDevice contains device1 then
    do shell script bin & " -s " & quoted form of device2
    display notification "已切换至: " & icon2 & device2
    else
    do shell script bin & " -s " & quoted form of device1
    display notification "已切换至: " & icon1 & " " & device1
    end if
    hanguokai
        29
    hanguokai  
       2h 15m ago
    @19cm 前面解释了,因为用户可能需要在多个设备之间切换。以 cmd+tab 为例,它是一个快捷键,但它实现了 2 个动作:选择和确认切换。如果只有 2 个固定的设备,不需要选择,只切换就可以了,是可以单键完成的。我当前的产品是要满足用户有大于等于 2 个设备使用的。

    当然技术层面上,提供两套快捷键完成不同逻辑的功能也可以。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4015 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 10:16 · PVG 18:16 · LAX 03:16 · JFK 06:16
    ♥ Do have faith in what you're doing.