AppleScriptでMacの画面録画する際の音声を切り替える

# TL;DR

画面録画するとき、Macだと標準では内蔵マイクを入力にするので、Soundflowerや複数出力装置に音声切り替えをして録画している。私の環境では、Macbook Proのスピーカー、DELL~、Soundflower(2Ch)、Soundflower(64Ch)などがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/bab382d4-7eac-48d3-7121-abcbcd78477e.png)

録画のたびに音声を切り替えするのが面倒なのでAutomatorで切り替えするWorkflowを作った。

Menubarのサウンドのところが自動で切り替わっている様子。
![menubar_fps30_width640.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/0c6337e0-03a1-88fc-4a12-346c2c609504.gif)


# Motivation

Macで画面録画するのに、毎回音声をSoundflower（または複数出力装置）に設定して、`Shift+Command+5`するのが面倒。
画面録画するコマンド `screencapture` は、`screencapture -V 10 out.mov` など、オプションで秒数指定しないといけない。毎回指定するのはかなり面倒。また、標準では、Macbookの内蔵マイクを入力にしているので、動画のキャプチャなどに向いていない。Mac内で再生された音声を録音するためには、Soundflower (2Ch)、Soundflower (64Ch)を入力にする必要がある。（または複数出力装置）
-Gオプションを使えば、`screencapture -V 10 -G SoundflowerEngine:0 out.mov` などでSoundflowerに指定できるが、（参照 [list-av-capture-devices](https://github.com/uasi/list-av-capture-devices/)）、私の環境（Intel Macbook pro 2020, OS：Monterey）ではどちらでも音声を拾えなかった。

そこで、
(i) Menubarのサウンドを「複数出力装置」に設定→`Shift+Command+5`で録画するAppleScript（アプリケーション）
(ii) movファイルが出力されたらサウンド設定を元の「Macbookのスピーカー」に戻すWorkflow
を作成した。
~~ついでにmovをmp4にするWorkflowも作ったが録画するたびにエンコードにCPUを使うのは面倒なので使うかはペンディング。~~ 結局使わなかった。
（movはなぜか容量が大きくて、mp4にエンコードすると容量が小さくなる。酷いときにはmp4にエンコードしたら10分の1くらいにもになる...）

# Procedure

(i) Menubarのサウンドを「複数出力装置」に設定→`Shift+Command+5`で録画するAppleScript

Automator→アプリケーション→AppleScriptを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/17ec62e1-847b-65b1-ab09-02ccde301f5a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/e56339de-7ef0-ab62-aee9-14f392d7a1a7.png)

Better Touch Toolなどでショートカットを割り当てれば便利。

(ii) movファイルが出力されたらサウンド設定を元の「Macbookのスピーカー」に戻すWorkflow　（フォルダアクション）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/84833184-ce0d-8ce5-17a2-1e04acf4c5e7.png)

Automator→フォルダアクション→AppleScriptを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/9014a8aa-fe0f-1ad8-e50f-09470eeb0588.png)

フォルダアクションで、`次の場所に追加されたファイルやフォルダを受け取る：`のところを自分の環境で画面録画が保存されるフォルダにする。

（ついでにmovをmp4にするWorkflowも作ったが,,,これを使う場合は`シェルスクリプトを実行`、入力の引き渡し方法のところを`引数として`にすること）

最初に実行したらアラートが出て、FolderActionsDispatcherを許可しないといけない？当然、作ったアプリケーションの許可も。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/099181ff-21cd-3d5f-618d-2f34fb1dee9c.png)

Finderからフォルダアクションの設定も必要（かもしれない）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/65525087-91e6-49dc-96a6-3c9ffa0f6327.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/4aa90883-35cf-daed-9167-9393e863ed20.png)


# Source



<details>
<summary>record.app</summary>

```
tell application "System Events"
	tell application process "ControlCenter"
		set volMenu to menu bar item "サウンド" of menu bar 1
		tell volMenu to click
		set controlWindow to window "コントロールセンター"
		set outputsList to scroll area of controlWindow
		set complexToggle to checkbox 1 of scroll area 1 of window "コントロールセンター" whose title contains "複数出力装置"
		set complexToggleValue to value of complexToggle
		tell complexToggle to click
		tell volMenu to click
	end tell
end tell
tell application "System Events"
	key code 23 using {command down, shift down} -- command+shiftを押しながら5
end tell
```
</details>
Menubarのサウンドを「複数出力装置」に設定→`Shift+Command+5`で録画するAppleScript。画面全体を収録するのか、選択部分を収録するのかで毎回異なると思うので、その直前まで自動化。 "複数出力装置"のところを自分の環境に合わせてください。


(ii) movファイルが出力されたらサウンド設定を元の「Macbookのスピーカー」に戻すWorkflow

<details>
<summary>soundchange.workflow</summary>

```
tell application "System Events"
	tell application process "ControlCenter"
		set volMenu to menu bar item "サウンド" of menu bar 1
		tell volMenu to click
		set controlWindow to window "コントロールセンター"
		set outputsList to scroll area of controlWindow
		set complexToggle to checkbox 1 of scroll area 1 of window "コントロールセンター" whose title contains "MacBook Pro"
		set complexToggleValue to value of complexToggle
		tell complexToggle to click
		tell volMenu to click
	end tell
end tell
```
</details>
ほぼ再利用。

movをmp4にするWorkflowはこれ。
```
originPath=$1
newFilePath=${originPath/.mov/.mp4}
/usr/local/bin/ffmpeg -i $originPath $newFilePath
echo "$originPath"
```
```
originPath=$1
if [ -f ${originPath%.*}.mov ]; then mv ${originPath%.*}.mov ~/.Trash; fi
```

# 最後に
movファイルってなんであんなに重いの〜