この記事で学べること
- ffmpegの使い方(ごく一部、氷山の一角)
- 家に転がってるNEX-7の有効活用方法
必要なもの
- Linux
- 筆者はKernelを自前でビルドしてるUbuntu 21.10を利用
- 家に余ってるSONY αNEX-7
- HDMIキャプチャーボード
- 筆者はこれを利用
- 他、常識的に必要なケーブル類など
顔出しオンラインミーティングで差をつけろ!
やること
###概要
HDMI出力に対応したカメラの出力をPCからカメラデバイスとして認識させる。
α6000番台など最近のカメラはイメージセンサーに入ってきた映像をそのまま出力できるがNEX-7のようなカメラでは背面液晶に映っている画像を出力することとなるので、余計な表示が入らないようにする。
Zoom等で顔出しミーティングに参加する。
それでは次項から詳しく見ていくとしよう。
NEX-7の液晶の解像度を調べる
SONYのサイトで仕様を確認する。
総画素数が 921,600 となっておりアスペクト比は記載されていないが16:9なので、1280x720である。
NEX-7の液晶に表示される余計な物を消す
イメージセンサーが3:2なので液晶の(0,0)から(1080,720)の範囲がイメージセンサーで捉えた映像となっており、右側200pxにはインフォメーションなどが表示される。
そしてイメージセンサーで捉えた映像を映す領域に何も表示せず、右側200px部分にのみカメラの設定値を表示させるモードがあるのでそれに設定する。
フォーカスモードはマニュアルフォーカスモードにする。
当然、グリッド表示なども消しておく。
PCと接続する
HDMI出力をHDMIキャプチャーボードに入力し、HDMIキャプチャーボードをPCに繋ぎましょう。
他にカメラ等を繋いでいなければ /dev/video0
あたりで認識されるはず。
ここで直接Zoom等でカメラの映像をソースにすると当然ながら右側200px部分に表示される情報まで映ってしまう。
続いてWebカメラ(HDMIキャプチャーボード)の設定とffmpegで処理した内容を出力する仮想カメラ、そしてffmpegでの処理の内容を見ていこう。
v4l2-ctlでWebカメラの設定をする
と言ってもHDMIキャプチャーボードである。
今一度デバイスのパスを調べるが、昨今のLinuxでは以下のようなシンボリックリンクが作成されていると思われる。
(Ubuntu) [sakura@x2 ~]$ ll /dev/v4l/by-id/usb-VXIS_Inc_MiraBox_Video_Capture-video-index0
lrwxrwxrwx 1 root root 12 1月 19 00:59 /dev/v4l/by-id/usb-VXIS_Inc_MiraBox_Video_Capture-video-index0 -> ../../video5
筆者の環境ではHDMIキャプチャーボードが /dev/video5
として認識されている。
/dev/video5
以外になっても良いようにシンボリックリンクをそのまま使う。
INPUT_DEV=/dev/v4l/by-id/usb-VXIS_Inc_MiraBox_Video_Capture-video-index0
v4l2-ctl -d "$INPUT_DEV" \
--verbose \
-p 30 \
-v width=1280,height=720,pixelformat=YUYV
仮想カメラを作る
v4l2loopbackというカーネルモジュールを利用する。
まずはインストール。
sudo apt install -y v4l2loopback-dkms
sudo modprobe v4l2loopback
sudo modprobe -r v4l2loopback
正常に入ることを確認したら起動時に自動的に読み込まれるようにしておく。
options v4l2loopback video_nr=0,1,2,3,4 exclusive_caps=1 card_label="v4l2lo0,v4l2lo1,v4l2lo2,v4l2lo3,v4l2lo4"
上記のようにして v4l2loopback
モジュールを読み込むと /dev/video0
/dev/video1
/dev/video2
/dev/video3
/dev/video4
が生成される。
そしてこの状態でHDMIキャプチャーボードをUSB接続すると /dev/video5
として認識される。
ffmpegで処理する
イメージセンサーの画像が出ている1080x720の領域でクロップする。
アスペクト比が当然3:2となってしまうので両側に黒地で埋めて16:9に戻す。
ffmpeg -threads 4 \
-f v4l2 \
-thread_queue_size 8192 \
-framerate 30 \
-s 1280x720 \
-i "$INPUT_DEV" \
-vf "format=pix_fmts=yuv420p,crop=1080:720:0:0,pad=w=1280:h=720:x=100:y=0:color=black" \
-an \
-f v4l2 /dev/video0
-vf
オプションにて、(0,0)(100,720)が黒地、(100,0)(1180,720)がイメージセンサーが捉えた画像、(1180,0)(1280,720)が黒地という1280x720のイメージセンサーで捉えている画像だけを作り、/dev/video0
に出力している。
/dev/video0
はループバックデバイスで仮想カメラとして扱えるので、これをZoom等で入力ソースとしてやる。
以上で、どの誤家庭にも眠っているNEX-7を有効活用してオンラインミーティングに参加することが出来るようになる。
ちなみに筆者も使っているオンラインミーティングにオススメのレンズはこちらです。
それでは良いLinuxライフを。