如何在 macOS 上快速在后台录制系统音频?

如何在 macOS 上快速在后台录制系统音频?

在 macOS Monterey 上,我想要实现在 Windows 上使用 ShareX 可以实现的功能:使用全局热键录制系统音频,并将音频文件自动复制到剪贴板 - 所有操作都在后台进行。如果可能的话,我想避免使用专有软件来执行此操作。

[x] 录制系统音频

第一个问题是在 macOS 上录制系统音频。BackgroundMusic 应用程序轻松解决了这个问题。我先尝试让 BlackHole 工作,但我从未弄清楚如何使用系统音频作为输入源,同时仍能听到音频播放。不过,有了 BackgroundMusic,这从来都不是问题。

方法 A:使用 AppleScript 和语音备忘录?

为了录制音频,我首先尝试使用 AppleScript 和语音备忘录,本指南中描述。自撰写以来,有些事情发生了变化,因为语音备忘录不再在后台运行。我不知道为什么set visible of process appName to false,它perform action "AXRaise" of window 1 of process appName停止工作了。我联系了作者,他认为操作系统更新可能在某些时候破坏了工作流程。如果有人知道如何为蒙特雷修复它,我将不胜感激。遗憾的是我不知道如何调试它。

set appName to "VoiceMemos"
if application appName is running then
    tell application id (id of application appName)
        quit
    end tell
    copy {do shell script "echo $HOME"} to {homeFolder}
    set recordingsFolder to homeFolder & "/Library/Application Support/com.apple.voicememos/Recordings"
    set audioFileName to (do shell script "cd " & quoted form of recordingsFolder & " && ls -ltr -A1 | grep m4a | tail -1")
    set the clipboard to POSIX file (recordingsFolder & "/" & audioFileName)
else
    tell application id (id of application appName) to activate
    tell application "System Events"
        set limit to 10
        set counter to 0
        repeat
            if exists window 1 of process appName then exit repeat
            if (counter > limit) then exit repeat
            set counter to counter + 1
            delay 1
        end repeat
        perform action "AXRaise" of window 1 of process appName
        keystroke "n" using command down
    end tell
end if

方法B:使用shell脚本和FFmpeg?

我尝试了一种不同的方法,即使用 FFmpeg(和 Automator)的 shell 脚本。顺便说一下,我还没有解决将输出文件复制到剪贴板的功能,但它似乎是可行的这里讨论

这似乎按预期工作:

#!/bin/bash


if ! pgrep -x "ffmpeg" | grep -q "avfoundation"; then
  pkill ffmpeg
fi

output_file="/Users/user/Desktop/a_$(date +'%y%m%d-%H%M%S').wav"
/usr/local/bin/ffmpeg -f avfoundation -i ":0" -t 600 "$output_file"

它会在后台启动和停止录音。唯一的问题是生成的音频文件的质量。我在测试时遇到了一半文件出现噼啪声/失真/卡顿/加速问题。

我尝试改变这些事情,但没有成功:

  • 将采样率为-ar 44100
  • 将比特率设置为-b:a 128k
  • 将缓冲区大小设置为-max_delay 1000000
  • 将位深度设置为 32 浮点数-sample_fmt fltp(检查时我的 Mac 上为 32 浮点数)。

不过我不知道自己在做什么,所以去想想吧。有明显的解决方案吗?我认为问题出在 FFmpeg 设置上,而不是 BackgroundMusic,因为不同的方法都没有质量问题。话虽如此,如果列出设备完全相关,我确实会收到此错误:

user@mac ~ % ffmpeg -hide_banner -f avfoundation -list_devices true -i ""
[AVFoundation indev @ 0x7ff144005cc0] AVFoundation video devices:
[AVFoundation indev @ 0x7ff144005cc0] [0] FaceTime HD Camera
[AVFoundation indev @ 0x7ff144005cc0] [1] Capture screen 0
[AVFoundation indev @ 0x7ff144005cc0] AVFoundation audio devices:
[AVFoundation indev @ 0x7ff144005cc0] [0] Background Music
[AVFoundation indev @ 0x7ff144005cc0] [1] Bose QC35 II
[AVFoundation indev @ 0x7ff144005cc0] [2] Built-in Microphone
[AVFoundation indev @ 0x7ff144005cc0] [3] Background Music (UI Sounds)
[in#0 @ 0x7ff1440057c0] Error opening input: Input/output error
Error opening input file .
Error opening input files: Input/output error

帮助

那么,有人知道如何在 macOS 上实现此功能吗?FFmpeg 是可行的方法吗,还是有更简单的解决方案?语音备忘录脚本可以修复吗?

相关内容