雑記帳

ちょっとした文章とかメモ書きとか。

Webcamstudioを修正して3.7.1+カーネルでも使ってみる

webcamstudio本家では永らく更新が止まっており、メンテナンスだけになってしまっているプロジェクトだそうで。

Linuxでは未だに仮想カメラとしてのこなれているソフトは少ないので修正して動くようにしてみました。

環境:Ubuntu Linux 12.04.2LTS
Kernel 3.7.9

これで動くようにしてみます。

http://code.google.com/p/webcamstudio/ にてまだ入手することができます。

先ずはwebcamstudio_0.57beta4_all.debを入手してきます。

$ sudo dpkg -i webcamstudio_0.57beta4_all.deb

当然の事ながらそのままではカーネル3.7.9には対応していないのでインストールが完了しません。

そこで、次のパッチを適用します:

–diff_webcamstudio.patch–

--- webcamstudio.c.orig	2013-02-19 07:55:42.593627911 +0900
+++ webcamstudio.c	2013-02-20 05:47:54.094668804 +0900
@@ -1435,7 +1435,9 @@ init_buffers        (struct webcamstudio
     b->length            = buffer_size;
     b->field             = V4L2_FIELD_NONE;
     b->flags             = 0;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,6,1)
     b->input             = 0;
+#endif
     b->m.offset          = i * buffer_size;
     b->memory            = V4L2_MEMORY_MMAP;
     b->sequence          = 0;
@@ -1464,6 +1466,11 @@ init_vdev           (struct video_device
   vdev->minor        = -1;
   if (debug > 1)
     vdev->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
+#ifdef VFL_DIR_M2M
+  vdev->vfl_dir = VFL_DIR_M2M;
+#endif
+
   MARK();
 }

これにより、構造体からinputメンバが削られた影響を回避することができます。
(このあたりはv4l2loopbackの新しいカーネルへの対応の実装を参考にしています)
もうひとつ、Ubuntu 12.04.2LTSではjava6の提供がなくなっているのでこちらも対応が必要です。
そこで、次のパッチを適用します:

–diff_webcamstudio_shexec_modify.patch–

--- webcamstudio.orig    2012-06-20 22:31:10.117328614 +0900
+++ webcamstudio_patched    2012-06-20 22:45:07.207331138 +0900
@@ -3,10 +3,27 @@
# Patrick Balleux 2009
# Version 0.57beta4
INSTALLDIR=/usr/lib/webcamstudio
-JAVA_DIR=/usr/lib/jvm/java-6-openjdk/bin
-if [ -f $JAVA_DIR/java ]
+ARCH=$(uname -i)
+case $ARCH in
+    x86_64)
+        UNAME=-amd64
+        ;;
+    i386)
+        #UNAME=
+        ;;
+esac
+JAVA_DIR=/usr/lib/jvm/java-6-openjdk$UNAME/bin
+OPENJDK7_DIR=/usr/lib/jvm/java-7-openjdk$UNAME/bin
+ORACLE_JAVA_DIR=/usr/lib/jvm/java-7-oracle/bin
+if [ -f $OPENJDK7_DIR/java ]
then
-    JAVA_DIR=/usr/lib/jvm/java-6-openjdk/bin
+    JAVA_DIR=/usr/lib/jvm/java-7-openjdk$UNAME/bin
+elif [ -f $JAVA_DIR/java ]
+then
+    JAVA_DIR=/usr/lib/jvm/java-6-openjdk$UNAME/bin
+elif [ -f $ORACLE_JAVA_DIR/java ]
+then
+    JAVA_DIR=/usr/lib/jvm/java-7-oracle/bin
else
JAVA_DIR=/usr/lib/jvm/java-6-sun/bin
fi

ここで、

$ sudo patch `which webcamstudio` < diff_webcamstudio_shexec_modify.patch

とします。続いて、

$ sudo patch  /usr/share/webcamstudio/webcastudio-src/webcastudio.c < diff_webcamstudio.patch

とします。これによりwebcamstudio側の準備ができました。

$ sudo make install

とすると、webcamstudio.koが生成されます。

$ sudo insmod webcamstudio.ko

とした時に、何もエラーもなくdmesgが次のようであれば終了です。

$ dmesg
...
[  ...  ] v4l2loopack driver version 1.0.2 loaded
--webcamstudio--

もしも次のエラーがあった場合は次のステップへ。

$ sudo insmod webcamstudio.ko
insmod: error inserting 'webcamstudio.ko': -1 Unknown symbol in module
$ dmesg
[  ... ] webcamstudio: Unknown symbol video_ioctl2 (err 0)
[  ... ] webcamstudio: Unknown symbol video_devdata (err 0)
[  ... ] webcamstudio: Unknown symbol video_unregister_device (err 0)
[  ... ] webcamstudio: Unknown symbol video_device_alloc (err 0)
[  ... ] webcamstudio: Unknown symbol __video_register_device (err 0)
[  ... ] webcamstudio: Unknown symbol video_device_release (err 0)

カーネルモジュールのvideodev.koが読み込まれていないようです。
カーネル3.6.11からV4Lの階層が変わっているらしく、もしかするとvideodev.koがコンパイルされていないかもしれません。

$ cd <path-to-Kernelsource tree>/linux-3.7/
$ make xconfig

http://nlug.ml1.co.uk/2013/01/gentoo-kernel-3-6-11-webcams-v4l-uvc-video-kernel-config-change/3798 によると、

まず、V4Lを3.7で有効に扱うためには、
MEDIA_CAMERA_SUPPORTをyにする必要があります。

Location:
-> Device Drivers
-> Multimedia support (MEDIA_SUPPORT [=m])

これにより、CONFIG_VIDEO_V4L2_SUBDEV_APIをyにできるようになります。

Depends on: MEDIA_SUPPORT [=m] && VIDEO_DEV [=m] && MEDIA_CONTROLLER [=y] && EXPERIMENTAL [=y]

なので、このカーネルコンフィグではvideodev.koがmakeされるようになります。

参考画像:

Screenshot_from_2013-02-20 06:23:14

このカーネルコンフィグのカーネルを用いれば、/usr/share/webcamstudio/webcamstudio-src/にて

$ sudo make install

をすると

[sudo] password for <user>:
make -C /lib/modules/`uname -r`/build M=/usr/share/webcamstudio/webcamstudio-src modules_install
make[1]: ディレクトリ `/usr/src/linux-headers-3.7.9-custom-fornewercore2' に入ります
  INSTALL /usr/share/webcamstudio/webcamstudio-src/webcamstudio.ko
  DEPMOD  3.7.9-custom-fornewercore2
make[1]: ディレクトリ `/usr/src/linux-headers-3.7.9-custom-fornewercore2' から出ます
depmod -ae
WARNING: -e needs -E or -F
$ dmesg
...
[  ... ] v4l2loopack driver version 1.0.2 loaded

となり、ちゃんとロードされます。まさかカーネルコンフィグの仕業でwebcamstudioカーネルモジュールが読み込めなくなっているとは思わなかった。。。

ちゃんと起動できている。

$ webcamstudio
Using JRE: /usr/lib/jvm/java-7-openjdk-amd64/bin
OS is Linux
DEBUG: WebcamStudio video device (video0)
DEBUG: WebcamStudio video device (video0)
Starting iWebcamera Detection...
NetworkStream available on port 4888
You can use FFMPEG to connect to this stream...
ffmpeg -f ogg -i tcp://127.0.0.1:4888 test.ogg

どうやら動いているようだ。
Screenshot_from_2013-02-20 05:40:24

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。