Ubuntu Weekly Recipe

第619回 HDMIキャプチャーボードでZoomへの配信映像を加工する

この記事を読むのに必要な時間:およそ 6.5 分

OBSを使って映像を加工する

さて,本題の映像を加工する部分です。これにもいろいろな方法がありますが,今回は定番のOBS Studioを使います。

OBS(Open Broadcaster Software)はビデオの録画や配信でよく使われているソフトウェアで,さまざまな配信サービスへの対応や複数の映像ソースの合成,簡易的な映像編集などをサポートしている便利なツールです。

Ubuntu 20.04 LTSならリポジトリからobs-studioパッケージとして,ほぼ最新の25.0.3をインストール可能です。ただsnapパッケージなら,最新の25.0.8がUbuntuのどのリリースでも使えます。今回はsnap版をインストールしましょう。

$ sudo snap install obs-studio

あとはSuper+Aで表示されるアプリケーション一覧から「obs」と入力すればOBSを起動できます。初期起動時はセットアップウィザードを起動するか確認されますが,今回は特定の配信サービスを利用するわけではないので「Cancel」を押しておきましょう。さらに日本語のインターフェースに変更したい場合は,FileメニューからSettingsを選び,Languageを「日本語」に変更して「OK」ボタンを押してください。OBSが自動的に再起動し,日本語インターフェースになります。

図4 OBSのメイン画面

画像

OBS自体は非常に多機能です。Ubuntuの他のアプリケーションとは異なるUIなので,慣れるまでに時間がかかるかもしれません。ただ一度使い方を覚えたら便利になるので,最初は根気強くいろいろ調べながら触ってください。

とりあえず今回は「ウェブカメラの映像と任意の画像を合成して,UVCデバイスとして出力する」ことを目標とします。

ウェブカメラと任意の画像を合成する

OBSでは複数の「ソース」を合成して「シーン」として出力します。ウェブカメラと任意の画像を合成するということはつまり,ウェブカメラと任意の画像のふたつのソースを用意するということです。

まずは任意の画像を選択しましょう。

図5 ソースから+ボタンを押して「画像」を選ぶ

画像

ここで「ウインドウキャプチャ」を選択すれば任意のアプリケーションの表示を合成できますし,⁠テキスト」を選択すれば文字列を合成できます。また映像だけでなく音声も「ソース」として合成可能です。

図6 ⁠ソースを作成/選択」で名前を指定する

画像

今回は8.04の壁紙を使うことにしましょう。snap版のOBSはルートファイルシステムにはアクセスできないので,あらかじめホームディレクトリ以下にコピーしておきます。

$ cp /usr/share/backgrounds/hardy_wallpaper_uhd.png ~/snap/obs-studio/common/

図7 参照ボタンからファイルパスを選択しOKボタンを押す

画像

ただしこのままだと一部しか表示されないので,ソースの「hardy」を右クリックし,⁠出力サイズ変更(ソースサイズ⁠⁠」を選択してください。ただしもともと画像が3840x2400とサイズが大きいので,あとで調整することにしましょう。

図8 出力する画像が設定された

画像

次はウェブカメラを合成します。まずはあらかじめウェブカメラを接続しておいてください。画像のときと同様にソースから+ボタンを押して,今度は「映像キャプチャデバイス(V4L2⁠⁠」を選択します。

図9 ウェブカメラのプロパティ

画像

この時点でフレームレートや解像度を変更できますが,今回はこのままにしておきます。

図10 ウェブカメラと画像を合成できた

画像

思ったよりもカメラの映像が小さくなっています。これは画像側の解像度が大きく,それに合わせてキャンパスサイズを変更してしまったためです。キャンパスサイズはファイルの設定にある「映像」から変更できます。

図11 キャンパスの解像度を画面解像度に戻した

画像

このままだと先ほどと同じように画像の解像度が大きすぎるので,調整します。ソースの「hardy」を右クリックして,⁠変換」を選択,⁠画面に合わせる」を選びましょう。

図12 画像が1920x1080のサイズにスケーリングされた

画像

今度はカメラの画像が大きいですね。こちらはカメラの画像をクリックしたら表示される赤枠を使って手作業で調整します。

図13 カメラの映像は画面右上にワイプっぽく表示

画像

さて,本題の「カメラの背景」をなんとかする処理です。これには「エフェクトフィルタ」を使用します。

図14 カメラ映像を右クリックして,⁠フィルタ」を選択すると表示されるフィルタ設定ダイアログ

画像

今回は「イメージマスク/ブレンド」を利用します。他のフィルターに関してはOBSのWikiを参照してください。

イメージマスクではマスク画像を用意して,それを合成します。今回は単純に「周囲の余計な背景を切り取りたい」だけななので,モノクロの円形画像を用意しましょう。黒い部分がマスクされ,白い部分が残ります。

もちろん円形以外の複雑な形でもかまいません。GIMPや任意の画像ツールを作って好みの画像を作成してください。ここではImageMagickを使ってコマンドで画像を生成してしまいます。

$ sudo apt install imagemagick
$ convert -size 1920x1080 xc:black -fill white \
  -draw "circle 960,540 1260,940" \
  ~/snap/obs-studio/common/circle.png

マスク画像のアスペクト比はウェブカメラのそれと合わせておいたほうが楽です。ここでは16:9にしています。ちなみに使っているカメラのスペックの都合上,1920x1080だと遅延が大きいのでカメラそのものの解像度も1280x768に変更しました。

図15 設定ダイアログからマスク画像を選択・適用した状態

画像

図16 カメラや被写体の位置を調整して完成!

画像

マスク部分は固定になってしまうので,細かい位置の調整はカメラや被写体側で行ってください。これでウェブカメラから加工した画像が作成できました。

エフェクトフィルタはさまざまな効果を適用できますので,いろいろと試してみると良いでしょう。

合成した画像をUVCデバイスとして出力する

合成した画像をUVCデバイスとして出力します。これはOBSの文脈で言うとシーンの出力になります。そしてOBSにはシーンの出力方法として任意のディスプレイへ全画面出力する「全画面プロジェクター」が存在するのです。

シーンを右クリックして,⁠全画面プロジェクター」からHDMIキャプチャーデバイスであるディスプレイを選択します。

図17 今回は「ディスプレイ2」がキャプチャーデバイス

画像

これでUVCデバイスとして現在のシーンが出力されているはずです。ためしにguvcviewで確認してみましょう。

図18 画像だとわかりにくいかもしれないがウェブカメラとして合成画像がリアルタイムで表示されている

画像

図19 Zoomのビデオ設定でもHDMIキャプチャーボードが選択できていることがわかる

画像

これでうまく使えばZoomなどでも「人物をできるだけアップにせずに配信する」とか「背景をできるだけ切り取って配信する」ことが可能になります。ちらかっている部屋を写したくないし,バーチャル背景が使えるほど片付いていもいないという時に使えるのではないでしょうか。

ちなみにリモートミーティングにおける個人的にベストな解は「カメラを切る」です。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。