YouTube LiveのためのEmacs Lispを改良する

僕は時々、YouTube Liveでゲーム配信をしている。配信する際には OBS を使っていたが、どうも動作が重い。元々、使っているPCのスペックがそれほど高くないため、なんとか設定で改善できないかと、いろいろ試してはみたが上手くいかなかった。そこでffmpegを使って、YouTube Liveをするという方向に切り替えた。中身は対した事ない ffmpeg のラッパーだ。しかし、こういう風にする事で配信と僕の距離は近くなる。この心の距離の近さをこれからも大切にしたい。

ffmpegには元々AVFoundation経由でスクリーンの情報を取得でき、またRTMPSでデータを転送する事もできる。特定の画面のみをキャプチャする事は難しそうだったが、画面全体を配信するだけならffmpegでじゅうぶんだ。

前回ffmpegを使って配信を試してみた所、配信自体はできたけれどいろいろとマズい所も判明した。特にマズかった所は配信開始直後にCLIの画面が少し映るのだが、そこにffmpegのコマンドも映り込んでいた。YouTube LiveのAPIキーはRTMPのURLの中に付いているから、APIキーが映像として配信されてしまう。

コマンドはEmacsの async-shell-command で起動していたが、それによってffmpegの標準入出力のあるバッファが、カレントバッファとしてポップアップしてしまう。これが問題だった。そこで今回は、ffmpegが完全に裏で実行されるよう、 start-process を使って実装しなおす事にした。また、ちょうど同じ時期に作業PCの入れ替えも行っていた。そのため、ffmpegやEmacsの権限に関連する修正も行った。

まず、新しいPCにHomebrewを使いffmpegをインストールする。

brew install ffmpeg

そして前回使ったコマンドを実行する。しかし、ここで前回とは異なりffmpegが異常終了した。

ffmpeg -f avfoundation -r 30 -s 1920x1080 -i '1:0' -f flv 'rtmps://a.rtmp.youtube.com/live2/APIキー'
2024-08-17 20:55:10.840 ffmpeg[19101:477519] WARNING: Add NSCameraUseContinuityCameraDeviceType to your Info.plist to use AVCaptureDeviceTypeContinuityCamera.
objc[19101]: class `NSKVONotifying_AVCaptureScreenInput' not linked into application
objc[19101]: class `NSKVONotifying_AVCaptureScreenInput' not linked into application
objc[19101]: class `NSKVONotifying_AVCaptureScreenInput' not linked into application
[AVFoundation indev @ 0x136605be0] Configuration of video device failed, falling back to default.
エラーメッセージの抜粋

この問題の解消にハマった。しかし、以前使っていたPCでは普通にできていた。よくよく考えると、以前EmacsのmacOSでの権限付与を行っていた。そこで以前のブログを漁りmacOSにインストールしたEmacsからマイクにアクセスするに辿り付いた。これを参考にしながら、マイクと、画面収録の権限を付与するためEmacsのInfo.plistを手で編集した。

        <key>NSCameraUseContinuityCameraDeviceType</key>
        <true/>
        <key>NSMicrophoneUsageDescription</key>
        <string>Emacs requires permission to access microphone.</string>
</dict>
</plist>
Info.plistの追加した所を抜粋

そして、macOSの環境設定の「プライバシーとセキュリティ」の項目でマイクと、画面収録の権限の付与を行った。マイクの権限付与は、マイクにアクセスしないと項目が出なかった。今回はsoxを使ってマイクへのアクセスを行った。

brew install sox
sox -d testing.wav

これでマイクへのアクセスを許可する項目が表示された。

あとは、Emacs Lispの実装を、 start-process を修正した。修正したものを掲載する。これで来週から心置き無く配信できそうだ。