3
0

More than 1 year has passed since last update.

ミラーレスカメラの活用

Posted at

この記事で学べること

  • 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

正常に入ることを確認したら起動時に自動的に読み込まれるようにしておく。

/etc/modprobe.d/v4l2loopback.conf
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ライフを。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0