別のmacでも、Stream Deck & OBS

自宅のMacBook Proで操作できるのはいいとして、職場のマシンでもできないと困る。 というわけで、インストール&テスト。

また、マルチデスクトップでどの程度キャプチャできるかも要確認。

OBSでシーンを2つ用意して、Stream Deckで切り替えしてみる。

シーンに名前をつけて、 00_FaceTime 01_NDI としてみる。

要するに、 シーン00は、内蔵カメラをキャプチャ。 シーン01は、NDIで他のパソコンのデスクトップ映像をキャプチャ。

シーンを作り、Stream Deckアプリを起動して、ボタンを作成。 、、と、ここでトラブル。

Stream Deckのメニューから、OBSの「シーン」をボタンにセットすると、 「OBSを待っています」みたいな表示になったまま、進展しない。

くるくる回ってはいるが、待ってもシーンの設定ができない。

Stream Deckでシーンを操作するには、当然同じパソコンで動作している OBSと通信して、作成済みのシーンを読み取る。

だからOBSを待って通信しようとするのは理解できるが、、なぜ通信できない。

待機中にOBSを起動してもダメ。 OBSを起動した後でシーンボタンを追加してもダメ。

何でだろう、、と思っていたら、ふとOSの更新がまだなのを思い出した。 先々週のイベントが終わってからにしよう、と思っていたら忘れてしまい、 まだ更新してなかった(最新は Ventura だが、Monterey のままだった)。

そこで、関係あるかはともかく、OSを更新。 ダウンロードして、インストール。

すると今度は接続できた。 OSのせいか、マシンを再起動したためかは不明。

シーン00を呼び出すボタンと、 シーン01を呼び出すボタンを作成。

OBSのVirtual Camを起動して、Google Meetに接続してみる。 Windows PCでも会議に入ってモニタしながら、シーンを切り替える。

OBSがアクティブになっていない状況でも、切り替えできると確認。 やれやれ。

他にも確認したいことはあり、 オーディオをフェードIN /OUTできるか、 画像などの素材のON /OFFはどうか、 試しておきたい。

次回の学校行事は12月16日(金)。 それまでにシナリオを書いて、 素材を用意して、 シーンにまとめてテストしておこう。

今日のところは、この辺で。 とりあえず。

Stream Deckで、OBSもコントロールする

Stream Deckというくらいで、もちろんOBS Studio(配信アプリ)もコントロールできる。 元々アプリにプロファイルが入っているので、使いたい操作をボタンに登録すればOK。

Stream Deckにアプリを登録
何でも入って便利すぎ

シーンを登録すればシーン切り替えができるし、 マイクとか画像とかソースを登録すればON /OFFできる。

他にも操作いろいろワンタッチで可能になって、 まー便利なことこの上ない。

特に、ATEM Miniのコントロールと比べると、 間にCompanionを挟まなくていいので、準備も楽々。

というわけで、手に馴染ませるためにも、毎日使うことにしよう。 とりあえず。

Stream Deck with Companionで、ATEM Mini Pro をコントロールする

「左手デバイス」には色々あるらしく、画像の編集や配信オペレーションで 活躍しているとのこと。

そんなデバイスのひとつ、Stream Deckを活用すべく練習を開始。

ビデオスイッチャ(ATEM Mini Pro)を操作するにあたり、 複数のキー操作をまとめてワンタッチでできれば助かる。

ミスが減るのもあるが、映像がスッキリする。

最もよくある問題は、2カメに切り替えてPinPにする操作。

入力を「2」にして、PinPの位置を選択(4すみのどれか)してからON。 これでボタンを3回操作することになる。準備よく位置を事前に決めておいた としても、2回の操作は必要。

操作が面倒なだけでなく、映像が切り替わった「後で」PinPになるので、

見ていて明らかに2つの操作に見える。

これをボタン1回操作で実現すべく、Stream DeckアプリとCompanionを インストールしてテストしてみた。

Stream Deckアプリからは様々なプロファイルを選択してインストールできる。 今回は Companion をインストール。

続いて、Companionはwebインタフェイスなので、ブラウザで操作。 あらかじめ ATEM を LAN に接続してIPを取得(DHCP)させておき、 CompanionをIP指定で接続。

そこまで来ると、CompanionのUIでボタンを登録すると、Stream Deckアプリでも 「Companionボタンをドラッグ」するだけで、登録した位置に登録した内容のボタンが 表示される。

まずはシンプルに「CAM1」や「CAM2」ボタンを作る。 ATEMには、「CAM1」にビデオカメラ、「CAM2」にiPadを接続しておいた。

当然、Stream Deckのボタンを押すと、ATEMが操作されて、映像が切り替わる。 「CAM1」ボタンでビデオカメラ映像、「CAM2」ボタンでiPadの映像が表示される。

ここまでだけでも、web記事で見た通りにはいかず、ちょっと悩みながら準備。 大した手間では無いので、大丈夫だけれども。

これで準備が整ったので、「CAM2」ボタンの下に、「CAM2に切り替えて、CAM1をPinPで入れる」 ボタンを作る。

Companionの画面で「KEY1」を選択して新しいボタンに登録すると、PinPができる。 ただし、PinPの位置を決めるボタンは無いので、ATEMであらかじめボタンを押して 選択しておく(これはちょっと残念)。

少なくとも「KEY1」ボタンでPinPはできるが、事前に「CAM2」にしてからでないと 意図した表示にならない。(PinPをONにするだけだから、当然だ)

そこで次に、「KEY1」ボタンをクリックして操作を追加。 入力を「CAM2」に切り替える操作を加える。

すると、「KEY1」ボタンだけの操作で、「入力をCAM2にする」のと 「PinPをONにする」のが同時にできる。

これで、2アクションが1アクションに短縮! これはひと手間かける価値あり!!

あとは、CAM1の映像をキーフレームアニメーションで 縮小させてPinPにするとか、さらに表現を加えていけばよい。

しかし週末、Stream DeckとATEMを両方持ち帰るのは大変なので、 Stream Deckだけにして、土日は「OBSのコントロール」を試すことにする。

とりあえず、実験はOK。

グレイスケールと2値化(OpenCVのテスト; 続き)

画像を読み込んでコピーできるなら、 その読み込んだ画像オブジェクトを使って加工してみる。

まず、元のカラー画像をグレイスケール( gray scale )に変換して表示する。

import cv2

img = cv2.imread('img.png')
img_gray = cv2.cvtColor(img, cv2.BGR2GRAY)        # グレイスケールに変換する

cv2.imshow('img_grayscale', img_gray)        # 画像を表示する
cv2.waitKey()        # キー入力を待つ(待たせないと、表示した次の瞬間プログラムが終了する)

cvtColor()関数も、元のデータを変更するのではなく、グレイスケールにした画像オブジェクトを生成して返す。

しかし、定数はなんでこんな名前なのか。BGRって、RGBの逆? 定数なんだから、こうだと言われれば使うまでだが、変な感じ。

次に、グレイスケールにしたものを2値化する。 引数で2値の境界を指定する。

import cv2

img = cv2.imread('img.png')
img_gray = cv2.cvtColor(img, cv2.BGR2GRAY)        # グレイスケールに変換する
img_binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)        # グレイスケール画像を、2値化する

cv2.imshow('img_grayscale', img_gray)        # 画像を表示する
cv2.waitKey()        # キー入力を待つ(待たせないと、表示した次の瞬間プログラムが終了する)

2値化するにあたり閾値を指定できるのは便利。 画像によって、真ん中がちょうどいいとは限らない。 明るい方に寄っていたり、暗い方に寄っている場合は、調整が必要。

基本的な処理を落ち着いて見ると、ライブラリ設計者の気遣いが感じられて面白い。 とりあえず。

OpenCV書き始め(あるいは休暇最終日のリハビリ)

修学旅行の引率を免れたのをいいことに、代休を消化して5連休。 のんびりできて助かったが、仕事の頭脳に切り替えるため、少しリハビリ。

そんな時はcodeを書くのが良いが、知ってるcodeを書いてもしかたないので、 OpenCVのテストをPythonで。

学生時代からあるライブラリだが、Pythonは当時無かった。 というか、Javaがデビューした頃なので、、Pythonなど知るわけもなく。

とりあえず、画像ファイルを読み込んで、コピーとリサイズしておく。

import cv2

img = cv2.imread('img.png', img)            # 画像ファイルを読み込む

もちろん読み込んだだけでは何も起きないが、リハビリのため一つずつ処理を実行。 そのまま別のファイルに書き込む。

import cv2

img = cv2.imread('img.png', img)            # 画像ファイルを読み込む

cv2.imwrite('img2.png', img)            # 読み込んだ画像データを、新しいファイルに書き込む

引数として「対象のファイル名」、次に「画像オブジェクト」。 それはそれで、わかりやすい。

「何を」「どこへ」という流れの順に書くのも納得感があるけれど、 「こういう順なのね」と気づいて確認して、実行するのはリハビリ安全策。

実際に新しいファイル「img2.png」ができていて、画像がコピーされているのを確認。

次に、リサイズ。 元の画像は横長だが、300x300 の正方形にしてから、別ファイルに書き込んでみる。

import cv2

img = cv2.imread('img.png', img)            # 画像ファイルを読み込む
cv2.resize(img, dsize=(300, 300))            # 読み込んだ画像データをリサイズする
cv2.imwrite('img2.png', img)            # リサイズした画像データを、新しいファイルに書き込む

しかしこれでは、元の画像と同じ内容が書き込まれる。

、、ということは、.resize()関数は、戻り値として処理結果の画像オブジェクトを返すだけで、 引数の画像オブジェクトを変更はしない。 あ、そ。

import cv2

img = cv2.imread('img.png', img)            # 画像ファイルを読み込む
img2 = cv2.resize(img, dsize=(300, 300))            # 読み込んだ画像データをリサイズして新しい画像オブジェクトを生成する
cv2.imwrite('img2.png', img2)            # 新しい方の画像オブジェクトを、ファイルに書き込む

これなら、リサイズ済みの画像オブジェクトをファイルに書き込むことができる。 (あたりまえだ) できたファイルを開くと、当然 300x300 のサイズになっている。

という辺りで、都合によりリハビリ終了。 (休日は休日で、家庭の事情があれこれあるため、)無理しない程度にとどめておこう。

とりあえず。

opencv-pythonをインストール(または、ようやく開発準備を開始)

今回の卒業制作では、なぜかスマホアプリが複数。

mac持ってないのにiPhoneアプリを作るなど、薄い発想だ、、 というより思いつきが浅い。

経験が有無ではなく、きちんとやる、という態度で生きてないと 土台が整わない。

それはともかく、codeレベルで追いかけていないと不都合なので 環境構築から。

本日は諏訪湖畔まで親戚を訪ねた後でリソースが少ないため、 とりあえず OpenCVPythonライブラリのみインストール。

念のため、以前にインストールしてないか確認して、 pip を update して、 インストールして、 インタプリタ環境で import して確認。

% pip3 list
% pip3 install opencv-python
% pip3 install opencv-contrib-python
% python3

>>> import cv2

インストールと import なら、特に失敗するわけもなく。 準備完了。

顔認識とか文字認識とかやる前に、OpenCVで遊んでおかないと。 続きはまた明日考える。

とりあえず。

toolを積極的に導入すべきこと(あるいは、永遠に効率UPを継続しないとワンオペやってられない件)

校内イベントのライブ配信をワンオペで取り組んでみると、 限界が具体的に体感できる。

個別には、できない事は無いにしても、同時に複数実行はできないし、 1アクションで実行したいが物理的に2アクションになってしまう事もあり。

最も差し迫って必要なことは、「カメラ切り替えと同時にPinP」。

ATEM MIni Proを使っていて、カメラの切り替えは簡単。 PinP(ワイプとも聞くがなぜかは知らん)も簡単。

しかし、「切り替え」てから「PinP」とすると、 うまくやっても「一瞬、カメラ映像のみ」になる。

それが演出として自然なら良いが、そんな計画はしてないので 「単にズレてるだけ」になる。

SQLで言うと、「DELETE & INSERT」でデータの更新はできるが、 2アクションなので、その間に別のクエリが割り込むと、大変まずいのと同じ。

ならば「UPDATE」文で1アクションにて更新処理を実行すれば問題ない。

ビデオスイッチャにはそんなのあるのか、というと、ある。 「Companion」というツールを使うと、いわゆる「マクロ」を組んで操作できる。

さらに、「StreamDeck」というハードウェア(ボタンが並ぶUI)と組み合わせると、 マクロをボタンに割り当てて、複雑な操作が1タップで実行できる。

aimfoc.com

別に、落ち着いて操作してれば教室1部屋くらいの空間ならワンオペで大丈夫、 と思っていたのだが、ちょっとそうもいかない現実。

ならばやるしかない。 今回のイベントは、12月にも、年明けにもあるんだし。 進歩していないと、生きてる意味がない。

先日まで「使いこなせると、よりHappyになれるハードウェア」と 思っていた「StreamDeck」。実は「無くてどうすんだこれ。無理だろう」 という代物だったことにようやく気づく。

我ながら遅い&鈍いが、気づいたからには、取り入れる。