[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Droidcam: Android phone as Debian webcam



Hi everybody,

droidcam is a small utility which converts an Android phone into a webcam for 
linux (connected by USB or Wifi). Since there is a webcam shortage right now 
and many people have Android phones, I thought I post my notes here for 
everybody who needs a webcam on a Debian 10 system. It worked for me with a 
Moto G4 plus with ArrowOS and a Google Pixel with the latest Android release 
for this device.

Technically droidcam implements a v4l2 kernel module which make the droidcam 
look like a local webcam. In addition, a  newer version of libjpeg62-turbo is 
needed. This I compiled from source to /opt, since I was not sure if I break 
something if I recompile the experimental package for buster and replace the 
buster package.

I built and installed the software in /opt as local install user, except the 
kernel module which needs to go at the regular place. This probalby could be 
done better, since there is a pull request which implements dkms usage.

To run the phone as webcam, the droidcam app needs to be installed on the 
Android phone and the droidcam-cli command needs to run on the Debian machine. 
That is all what is needed.

I hope this is useful for somebody.

Droidcam:
=========
# apt-get build-dep libjpeg62-turbo
# apt-get install libswscale-dev gtk+-2.0 libavutil-dev
# mkdir /opt/libjpeg62-turbo-2.0.4/

=> I have a local user just to install software into /opt or /usr/local/ 
# chown install /opt/libjpeg62-turbo-2.0.4/
# cd /opt
# ln -s libjpeg62-turbo-2.0.4 libjpeg-turbo

As install user new libjepg62-turbo:
# su - install


install@gigabyte:~$ wget http://deb.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg-turbo_2.0.4.orig.tar.gz
install@gigabyte:~$ tar xfz libjpeg-turbo_2.0.4.orig.tar.gz   
install@gigabyte:~$ mkdir build
install@gigabyte:~$ cd build/
install@gigabyte:~/build$ cmake -G"Unix Makefiles" cmake -
DCMAKE_INSTALL_PREFIX=/opt/libjpeg62-turbo-2.0.4/ ../libjpeg-turbo-2.0.4
-- The C compiler identification is GNU 8.3.0
[...]
[...]
-- Build files have been written to: /home/install/build
install@gigabyte:~/build$ make
Scanning dependencies of target simd
[  0%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jsimdcpu.asm.o
[  0%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jfdctflt-
sse.asm.o
[  1%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jccolor-
sse2.asm.o
[...]
[ 97%] Built target djpeg
[ 98%] Built target jpegtran
[ 99%] Built target jcstest
[100%] Built target md5cmp
Install the project...
-- Install configuration: "Release"
[...]
-- Installing: /opt/libjpeg62-turbo-2.0.4/bin/jpegtran
-- Set runtime path of "/opt/libjpeg62-turbo-2.0.4/bin/jpegtran" to "/opt/
libjpeg62-turbo-2.0.4/lib"
install@gigabyte:~/build$ cd /opt/libjpeg62-turbo-2.0.4/
install@gigabyte:/opt/libjpeg62-turbo-2.0.4$ make test
[...]
install@gigabyte:~/build$ make install
[  8%] Built target simd
[...]


Install droidcam cli and v4l2 kernel module:
--------------------------------------------



install@gigabyte:~/git$ git clone https://github.com/aramg/droidcam.git
Cloning into 'droidcam'...
remote: Enumerating objects: 66, done.
remote: Counting objects: 100% (66/66), done.
remote: Compressing objects: 100% (34/34), done.
remote: Total 293 (delta 25), reused 45 (delta 19), pack-reused 227
Receiving objects: 100% (293/293), 1.19 MiB | 2.65 MiB/s, done.
Resolving deltas: 100% (117/117), done.
install@gigabyte:~/git$

Adapt install paths:

install@gigabyte:~$ cd git/droidcam/
install@gigabyte:~/git/droidcam$ git diff
diff --git a/linux/Makefile b/linux/Makefile
index 134f723..541b06a 100644
--- a/linux/Makefile
+++ b/linux/Makefile
@@ -9,7 +9,8 @@
 CC    = -no-pie
 GTK   = `pkg-config --libs --cflags gtk+-2.0`
 LIBS  = `pkg-config --libs libswscale libavutil`
-JPEG  = -I/opt/libjpeg-turbo/include /opt/libjpeg-turbo/lib`getconf 
LONG_BIT`/libturbojpeg.a
+#JPEG  = -I/opt/libjpeg-turbo/include /opt/libjpeg-turbo/lib`getconf 
LONG_BIT`/libturbojpeg.a
+JPEG  = -I/opt/libjpeg-turbo/include /opt/libjpeg-turbo/lib/libturbojpeg.a
 SRC      = src/connection.c src/decoder.c
 NO_WARN  = -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast
 
diff --git a/linux/install b/linux/install
index 6189db5..a68db85 100755
--- a/linux/install
+++ b/linux/install
@@ -68,8 +68,8 @@ fi
 
 set -x
 cp "$V4L2_LOOPBACK_DIR/$V4L2_LOOPBACK_KO" $DRIVER_LOCATION
-cp droidcam /usr/bin/
-cp droidcam-cli /usr/bin/
+cp droidcam /usr/local/bin/
+cp droidcam-cli /usr/local/bin/
 set +x
 
 echo "Registering webcam device"
diff --git a/linux/uninstall b/linux/uninstall
index 9acc7b5..39c9344 100755
--- a/linux/uninstall
+++ b/linux/uninstall
@@ -4,7 +4,7 @@
 echo "Un-loading driver module"
 sudo rmmod v4l2loopback_dc
 echo "Removing files"
-sudo rm -f /usr/bin/droidcam*
+sudo rm -f /usr/local/bin/droidcam*
 sudo rm -f /lib/modules/`uname -r`/kernel/drivers/media/video/v4l2loopback-
dc.ko
 
 etc_modules() {
install@gigabyte:~/git/droidcam$




install@gigabyte:~/git/droidcam$ cd linux/
install@gigabyte:~/git/droidcam/linux$ make
gcc -Wall -no-pie -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast src/
droidcam.c src/connection.c src/decoder.c `pkg-config --libs --cflags gtk+-2.0` 
-I/opt/libjpeg-turbo/include /opt/libjpeg-turbo/lib/libturbojpeg.a `pkg-config 
--libs libswscale libavutil` -lm -o droidcam
src/droidcam.c: In function ‘main’:
src/droidcam.c:418:2: warning: ‘gdk_pixbuf_new_from_inline’ is deprecated [-
Wdeprecated-declarations]
  gtk_window_set_icon(GTK_WINDOW(window), gdk_pixbuf_new_from_inline(-1, 
icon_inline, FALSE, NULL));
  ^~~~~~~~~~~~~~~~~~~
In file included from /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf.h:34,
                 from /usr/include/gtk-2.0/gdk/gdkpixbuf.h:37,
                 from /usr/include/gtk-2.0/gdk/gdkcairo.h:28,
                 from /usr/include/gtk-2.0/gdk/gdk.h:33,
                 from /usr/include/gtk-2.0/gtk/gtk.h:32,
                 from src/droidcam.c:16:
/usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-core.h:362:12: note: 
declared here
 GdkPixbuf* gdk_pixbuf_new_from_inline (gint          data_length,
            ^~~~~~~~~~~~~~~~~~~~~~~~~~
install@gigabyte:~/git/droidcam/linux$ su -
Password: 
root@gigabyte:~# cd /home/install/git/droidcam/linux/
root@gigabyte:/home/install/git/droidcam/linux# ./install 1920 1080
Webcam parameters: '1920' and '1080'
Building v4l2loopback-dc.ko
make: Entering directory '/home/install/git/droidcam/linux/v4l2loopback'
make -C /lib/modules/`uname -r`/build M=`pwd`
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-0.bpo.4-amd64'
  AR      /home/install/git/droidcam/linux/v4l2loopback/built-in.a
  CC [M]  /home/install/git/droidcam/linux/v4l2loopback/v4l2loopback-dc.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC [M]  /home/install/git/droidcam/linux/v4l2loopback/v4l2loopback-dc.mod.o
  LD [M]  /home/install/git/droidcam/linux/v4l2loopback/v4l2loopback-dc.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-0.bpo.4-amd64'
make: Leaving directory '/home/install/git/droidcam/linux/v4l2loopback'
./install: line 44: mokutil: command not found
Moving driver and executable to system folders
+ cp v4l2loopback/v4l2loopback-dc.ko /lib/modules/5.4.0-0.bpo.4-amd64/kernel/
drivers/media/video/
+ cp droidcam /usr/local/bin/
+ cp droidcam-cli /usr/local/bin/
+ set +x
Registering webcam device
Running depmod
make: Entering directory '/home/install/git/droidcam/linux/v4l2loopback'
make -C /lib/modules/`uname -r`/build M=`pwd` clean
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-0.bpo.4-amd64'
  CLEAN   /home/install/git/droidcam/linux/v4l2loopback/Module.symvers
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-0.bpo.4-amd64'
make: Leaving directory '/home/install/git/droidcam/linux/v4l2loopback'
Adding uninstall script
Adding driver to /etc/modules
Done
root@gigabyte:/home/install/git/droidcam/linux#


Notes:
------
(default resolution is 640x480)

-- the install script builds the kernel module, i.e. needs to rerun at every 
install


==> Test with guvcview


To uninstall:

# ./uninstall 


There is a pull request which uses dkms for building the kernel module


On Android phone:
- Install droidcam app on Android phone
- Recommended: use usb cable for latency reasons
- Run adb shell and allow computer access to phone
- Exit adb shell again

To run:
- Start droidcam on phone
- Run (for usb cable): droidcam-cli 127.0.0.1 4747 


In case a DD read that far: certainly it would be a big plus if you can make a 
regular Debian package out of it , it seems to be little code, so hopefully 
the effort is limited. :-)

-- 
Rainer Dorsch
http://bokomoko.de/



Reply to: