前回からの続きです。
https://kkoken.net/windowsusblinux/
以前には 定数 VFL_TYPE_VIDEO がないため、GV-USB2-Driver をビルドすらできなかったDebian10(buster)4.19.0でしたが、今回は5.10.0へバージョンアップしたために対応ができるようになりました。
https://kkoken.net/debian10versionup/
そこで今回は、GV-USB2-Driverを使えるようにするまでの流れになります。
[affi id=2]
GV-USB-Driverの導入方法
以下を参考にしました。
scaramangado/streaming-on-linux.md
GV-USB2-Driverなど必要なツールを入手します。
前回までのことになりますが、Linux Driverリポジトリ(by Isaac-Lozano)からドライバソースを入手します。
~$ git clone https://github.com/Isaac-Lozano/GV-USB2-Driver
ビルドに必要なツールが入っていない場合はインストールします。
~$ sudo apt update && sudo apt install build-essential linux-headers-$(uname -r)
入手したドライバディレクトリへ移動します。
~$ cd GV-USB2-Driver
ドライバをビルドします。
~/GV-USB2-Driver$ make clean
~/GV-USB2-Driver$ make
ディレクトリに gvusb2-sound.ko と gvusb2-video.ko が追加されます。
~/GV-USB2-Driver$ ls
ドライバモジュールを起動します。
gvusb2サウンドドライバはindexを指定する必要がありますので、現在の使用状況を確認します。
~/GV-USB2-Driver$ cat /proc/asound/cards
サウンドカードのindexは最後の番号に1を追加した番号になります。ここではindex=2となります。
サウンドドライバモジュールの起動
~/GV-USB2-Driver$ sudo insmod gvusb2-sound.ko index=2
ビデオドライバモジュールの起動
~/GV-USB2-Driver$ sudo insmod gvusb2-video.ko.
と、ここでエラー発生
「unkown symbol in module 」ということですので、Linux カーネルモジュールに「シンボル」と呼ばれるサービスを他のモジュールが使えるようにしなければなりません。 「insmod」コマンドは依存するモジュールがロードされていない場合はエラーになります。
「depmod 」コマンドは /lib/modules/$(uname -r) 以下のモジュールをひとつひとつ読み込み、 各モジュールがどんなシンボルをエクスポートして、どんなシンボルを必要としているかを調べて、 モジュールの依存関係をリストにするコマンドです。リストは同じディレクトリ内の modules.dep に登録されます。
まずはgvusb2ドライバモジュールが認識されるように、/lib/modules/$(uname -r)/drivers/videoディレクトリを作り、そこにgvusb2-sound.ko, gvusb2-video.ko をコピーします。
~/GV-USB2-Driver$ sudo mkdir -p /lib/modules/$(uname -r)/drivers/video
~/GV-USB2-Driver$ sudo cp *.ko /lib/modules/$(uname -r)/drivers/video
これでdepmodコマンドにより、ファイルが読み込まれます。
~$ sudo depmod
サウンドドライバインデックスを調べて、今度は依存するモジュールも含めてロードする「modprobe」コマンドでロードします。
~$ cat /proc/asound/cards
~$ sudo modprobe gvusb2-sound index=2
ビデオドライバもロードします。
~$ sudo modprobe gvusb2-video
ドライバが入っているかを確認します。
~$ lsmod
「gvusb2-sound」と「gvusb2-video」が入っていれば成功です。
VLCメディアプレイヤーやOBSなどでキャプチャ画像を確認します。
ドライバの取り外し
ドライバモジュールの取り外しは「-r 」(–remove) オプションを使います。
~$ sudo modprobe -r gvusb2-video
rmmodコマンドも使えますが、モジュールが使用中や他のモジュールと依存関係があるとエラーになります。
~$ sudo rmmod gvusb2-video
ドライバーを自動的にロードする方法
以下のシェルスクリプトを実行するだけです。 シェルスクリプトに関する詳細はこちらです。
#!/bin/bash
# Compile Kernel Modules
make clean
make
# Move to kernel path
sudo rm -f /lib/modules/$(uname -r)/drivers/video/gvusb2-*.ko
sudo cp *.ko /lib/modules/$(uname -r)/drivers/video
# Register modules
sudo depmod
# Find index for the audio module
local alsa_index=$(cat /proc/asound/cards | grep ]: | wc -l)
# Write auto-load configuration
sudo echo "usbtv
gvusb2-sound index=$alsa_index
gvusb2-video" > /etc/modprobe.d/gvusb.conf
8行目にある drivers/video/ が存在しないときは、こちらで事前に作る必要があります。
”モジュールの確認”
$ ls /lib/modules/$(uname -r)/
"drivers/video がない場合は作ります"
$ sudo mkdir -p /lib/modules/$(uname -r)/drivers/video
再起動後にデバイスを接続して、VLCメディアプレイヤーなどで映像キャプチャ画像を確認します。
VLCメディアプレイヤーで映像を確認
今回はデジタルビデオカメラの映像を取り込んでみました。
GV-USB2デバイスをビデオカメラとPCに接続したら、VLCメディアプレーヤーを起動して、「メディア」→「キャプチャデバイスを開く」を選択します。
「Advanced options…」を選択します。
ビデオカメラの「画像のアスペクト比」は16:9ですので、デフォルト4:3を変更します。
「OK」を押して、「再生(P)」をクリックします。
このように、うまく表示されればOK?です。
OBSで映像を確認
次にOBSで画像キャプチャを取り込んでみます。
先程と同じように、ビデオカメラとPCをGV-USB2デバイスでつなげて、OBSを起動して、「ソース」から「+(追加)」→「映像キャプチャデバイス(v4l2)」を選択すると映像が出ます。
アスペクト比を変えるには「ソース」の「映像キャプチャデバイス(v4l2)」を右クリックして、「フィルタ」を選択します。
「フィルタ」画面下の「+(追加)」をクリックして「スケーリング/アスペクト比」を追加します。
「解像度」を4:3から16:9に変更して、「close」します。
画面が変わっていればOKです。
まとめ
実際に、GV-USB2ドライバをlinuxで使う方法についての情報が殆どない中で、なんとかドライバを探し出して、組み込むことができたのは、幸運だったと思います。
GV-USB2ドライバを開発していただき、使い方をレクチャしていただいた皆様に感謝するとともに、LinuxでGV-USB2ビデオキャプチャの使用をあきらめていた人たちの力になれればと思っています。
個人的にはゲーム配信で使っていきたいので、今後また気づいたことがあれば、随時発信していきたいと思います。
“GV-USB2-Driverをロードして、ビデオキャプチャ画像を表示させる” への6件のフィードバック
Thank you for this guide, I had no clue with ‘symbol’ error. Now I find way to use GV-USB2 on ArchLinux. Thanks again from Korea! ありがとうございました!
I am very happy to receive the words of gratitude. I was worried about the symbol myself, so I’m proud to have helped those who are similarly worried.
分かりやすい記事ありがとうございます。一つ確認したいですが、Debian OS Buster でGV-USB2 driverで映像は取得されていることに成功していますね。私はRaspberry Pi 4 でも同じ 5.10 (Buster) で動かそうとしています。ドライバの読み込み、VLCでのストリーミングはできましたが、映像がきちんと映らなくて、同じ画面上でダブって表示されるようになっています。
ドライブリンク: https://drive.google.com/file/d/1DQwWAPfMSA6pI12CpWfpJyUBKcaLayCx/view?usp=drivesdk
この問題について何かご存知で有れば、教えて頂ければ助かります。
よろしくお願いします。
moon様 コメントありがとうございます。
GV-USB2-Driverの件ですが、正直、私もあまり良くわからないまま進めてきたので、お教えできる立場ではありませんが、おそらくV4l2の設定を変えることで対応できるかもしれません。
とりあえず、参考になりそうなURLを貼っておきますので、ご確認ください。
https://dev.classmethod.jp/articles/raspberry_pi_v4l2_ctl_get_resorution_from_webcam/
また、このGV-USB2-Driverについては、その後のlinuxアップデートにより音声が出なくなってしまったという事実も確認しています。
この件については、今後の課題として解決したときに、ご報告させていただきたいと思っています。
それでは、あまりお役に立てたかどうか分かりませんが、よろしくお願いいたします。
たまたま同じ現象を見ました。
根本の原因は不明ですが、表面的に見える最初の原因はUSBでのISOC転送のエラーです。
キャプチャ動作中に
dmesg -w
で見ることができますが、こちらの環境では1秒あたり10~30件のエラーが出ていました。
デバイス側の問題なのか、pi側の問題なのか、、
(こちらのpiは4Bで、OSは今の最新です)
さらにこのドライバではそのエラーが発生した際に特に対策をしていないため、
バッファの書き込み位置が本来の位置とはずれてしまい、結果、おかしな映像が
アプリ層まで回ってしまう、、ということのようです。
gvusb2-vid.c の buf_pos という変数なんですが、このエラー発生時は
urb->iso_frame_desc[i].actual_length がゼロに設定されているため、
書き込みポインタを何バイト進めるべきか分からないんですよねー。。
暫定で(511 * 4) を加算するとずいぶんマシにはなっていました。
ゆーぢ様
貴重なご意見に感謝します。
書き込み位置がずれてしまう原因が何なのかを知る必要がありますね。
ドライバはPiで異常が発生してしまうようなので、Piの設定の方も調べてみます。
それでは、何かわかりましたら、またご連絡させていただきます。