Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

raspberryPiでの仮想ビデオデバイス(/dev/video)の作成

今回は仮想ビデオデバイスを作成して作成したビデオデバイス経由で動画データのやり取りを行っていきます。
動画データのやり取りに用いるのはgstreamerです。
gstreamerについてはこちらにまとめておりますのでぜひ!!
elsammit-beginnerblg.hatenablog.com
elsammit-beginnerblg.hatenablog.com


■環境

今回の環境はこちらです。
・デバイス:raspberry Pi4
・OS:
・カメラ:UCAM-C520FBBK

■事前準備

仮想ビデオデバイス作成にあたり、v4l2loopを用います。
v4l2loopをインストールするために、

sudo apt-get install v4l2loopback-dkms

を実行。

■仮想ビデオデバイス作成

仮想ビデオデバイスを作成するコマンドは、

sudo modprobe v4l2loopback

です。
こちらを実行してから、

ls /dev/video*

を実行するとビデオドライバが1つ増えていることが確認できます。

さらに、複数ビデオデバイスを作成する場合には、

sudo modprobe v4l2loopback devices=デバイス数

となります。

■仮想デバイスを用いた動画表示

では実際に仮想ビデオデバイス経由で動画の再生を行ってみます!!
まずは作成したビデオデバイスへの動画データ書き込みです。
仮想ビデオデバイスがvideo2の場合、コマンドはこちらのようになります。

gst-launch-1.0 -v v4l2src device=/dev/video0 ! videoconvert ! v4l2sink device=/dev/video2 sync=false
device=/dev/video2

を作成したビデオデバイスに置き換えればOKです。

では次に仮想ビデオデバイスからの読み出しです。
コマンドはこちらのようになります。

gst-launch-1.0 -v v4l2src device=/dev/video2 ! videoconvert ! autovideosink

先ほどの動画書き込み側のコマンドを実行した後に、読み出し用のコマンドを実行すれば、
カメラからのキャプチャ動画が表示されるかと思います。

■go言語で仮想ビデオデバイスから読み出してみる

次にgo言語を用いて、仮想ビデオデバイスから動画データを読み出し、表示をしてみます。
コードはこちらです。

package main

import (
	"gocv.io/x/gocv"
	"image"
)

func main() {
	webcam, _ := gocv.OpenVideoCapture("v4l2src device=/dev/video2 ! videoconvert ! appsink")
	window := gocv.NewWindow("hello")
	img := gocv.NewMat()

	for {
		webcam.Read(&img)
		gocv.Resize(img, &img, image.Point{640, 480}, 0, 0, gocv.InterpolationDefault)
		window.IMShow(img)
		window.WaitKey(1)
	}
}

gocvを用いて、仮想ビデオデバイスから画像データを読み出し、
IMShowで表示しております。

gocv.OpenVideoCapture("v4l2src device=/dev/video2 ! videoconvert ! appsink")

へ与えるビデオデバイスを変更させれば好きなビデオデバイスからの動画読み出しが可能です。

■最後に

今回は仮想ビデオデバイスの作成方法についてまとめてみました。
こちらを用いれば、デバイスドライバ経由での動画データのやり取りが出来ますね!!

自分で作るのはしんどいな。。。と思っていたので、この方法が知れたのはありがたかった!!