職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

QuickTime Player で「新規ムービー収録」できなくなったときの対応(macOS Ventura)

表題のことが発生したので、その対応をしたメモをこの記事として残しておきます。
同じ症状であっても、別の原因であることも有り得ますので、検索等でこの記事に辿り着いた皆さんは、そのことを念頭に置いた上で読んで頂ければと思います。
MacアプリのUIデザインをする際の注意点も学べます💁‍♀️

↓の多重録音の動画を収録している時に遭遇した症状でした。
youtu.be

発症の直前の操作および症状

※後述しますが、ここの節で書いてある操作は、正しい再現手順ではありません。

Macにカメラ(というかHDMIキャプチャ)や audio interface 等のUSB機器を接続した状態で、QuickTime Player の「新規ムービー収録」機能を用いて録画をしていました。
最初は、映像はHDMIキャプチャから、音声は audio interface から取っており、途中で必要があって音声をHDMIキャプチャのものに変更しようとしました。すると、レインボーカーソルが回り始めて、しばらくすると「操作を完了できませんでした」というダイアログが表示されました。このダイアログは「OK」をクリックするとwindow丸ごと閉じられてしまいました。

改めて「新規ムービー収録」をやり直そうとすると、今度はwindowを開いただけでレインボーカーソルが回り始めて、同じ症状に陥りました。

「操作を完了できませんでした」ダイアログ

最初に試したこと:再起動など

QuickTime Player を再起動したり、OS再起動したりしましたが、「新規ムービー収録」をメニューから選択すると、やはり同じ症状に陥りました。

次に試したこと:設定ファイルを探す

OS再起動でも治らないことから、何か設定ファイルが壊れてしまったのでは?と疑って find コマンドで ~/Library/Application Support/ 内を探したりしましたが、それっぽいファイルは見当たりませんでした(見過ごしているだけの可能性あり)。

その次に試したこと:defaultsコマンド(当たり)

じゃあ壊れてるのは、defaults コマンドで操作できる部分かな?と思って、調べてみました。defaults コマンドの使い方は defaults って叩くだけで簡単な説明が得られますし、ネット上にもさまざまな解説があることでしょうから、そちらをご参照下さい。

defaults find で調べたところ、どうやら QuickTime Player の設定は、ドメイン com.apple.QuickTimePlayerX に格納されているようでした。

% defaults read com.apple.QuickTimePlayerX                                                
{
    AVDesktopPlaybackControlsControllerShowsDurationInsteadOfTimeRemainingDefaultsKey = 1;
    MGDeviceRecordingDocumentViewControllerAudioDeviceSelectionUniqueID = "{UUIDっぽい見た目のID}";
    MGDeviceRecordingDocumentViewControllerVideoDeviceSelectionUniqueID = 0x{16進数のID};
    MGInspectorWindowControllerShowWindowAtLaunch = 0;
    MGInspectorWindowControllerWindowTopLeftPoint = "{65, 295}";
    MGMovieRecordingWindowFrameTopLeftPoint = "{100, 844}";
    MGRecentDocumentURLBookmarks =     (
        {length = 780, bytes = 0x626f6f6b 0c030000 00000410 30000000 ... 04000000 00000000 },
        {length = 780, bytes = 0x626f6f6b 0c030000 00000410 30000000 ... 04000000 00000000 },
        (中略)
        {length = 832, bytes = 0x626f6f6b 40030000 00000410 30000000 ... 04000000 00000000 }
    );
    MGRecentDocumentsSharedFileListIsValid = 1;
    MGRecordingCompressionPresetIdentifier = MGCompressionPresetHighQuality;
    NSNavLastRootDirectory = "~/Documents/work";
    NSNavPanelExpandedSizeForOpenMode = "{800, 448}";
    NSNavPanelExpandedSizeForSaveMode = "{800, 448}";
    NSNavPanelExpandedStateForSaveMode = 1;
    "NSWindow Frame NSNavPanelAutosaveName" = "384 372 800 448 0 0 1512 944 ";
}

トラブルに見舞われた直前の操作から察するに、マイクの設定、つまり MGDeviceRecordingDocumentViewControllerAudioDeviceSelectionUniqueID が壊れているのではないか?と推測しました。それで defaults delete com.apple.QuickTimePlayerX MGDeviceRecordingDocumentViewControllerVideoDeviceSelectionUniqueID を実行したところ、無事に QuickTme Player で「新規ムービー収録」が実行できるように復旧しました。
よっ、さすが defaults コマンド!👏

治った後に気付いたこと

このブログ記事を書くべく再現手順を探っていたところ、マイク入力を audio interface から HDMIキャプチャ に変更しただけでは再現せず、頭を抱えておりました。
しかし、プルダウンメニューの中には自分のiPhoneが存在しており、そのiPhoneを選択すると、再現しました。どうやら今回の問題は、マイク入力としてiPhoneを選択すると起こるようでした。つまり、最初にこの問題に遭遇したときは、私は誤操作(いわゆる「ガバエイム」)をしていた、ということになります😇

それにしても、MaciPhoneとはUSBで接続している訳でもないのに、どうしてマイクとして使えるのだろう?と思ったら、いつの間にかこんな機能が追加されていました。
MacでiPhoneをWebカメラとして使用する
以下の条件を満たす時、iPhoneMacのカメラ等として利用できるそうです。

知らなかった…。。

そして、MacQuickTime Player 側でレインボーカーソルがぐるぐる回っている間、よく見るとiPhone側では以下のような画面になっておりました。

iPhone側の画面

ここで「Disconnect」をタップするとQuickTime Player のレインボーカーソルは停止して処理が続行した……ような気がします*1。おそらくこの操作が、レインボーカーソル地獄を抜け出すための最善の策なのでしょう。
それにしても、QuickTime Player 側は「iPhoneに接続を試みています」とかのダイアログを出せば良いのに、main thread でiPhoneに接続しに行ってるんでしょうか…? 今後の改善に期待です。(と言いつつ、自分のMacアプリも main thread の中で AVCaptureDeviceInput の初期化をしたりとかしてたので、近いうちに改善したいと思います)

ちなみに、iPhone側でロック解除して何かの操作をすればMacのカメラやマイクとして動作するのかな?と思って色々試しておりましたが、いずれも上手く行きませんでした。

まとめ

  • Ventura以上ではiPhoneをカメラ等として利用できる。
  • QuickTime Player の新規ムービー収録で固まったら、iPhone等の画面も見てみよう。
  • MacアプリのUIデザイナや開発者向け)AVCaptureDeviceなど、AVFoundationでデバイスを取り扱うアプリを作るときは、その初期化に時間がかかる可能性があることを考慮してデザインしよう。

環境情報

*1:これを試していたのは深夜だったので記憶が曖昧です。