linuxgoogle-chromechromiumvirtualwebcam

Using v4l2loopback virtual cam with google-chrome or chromium on linux while having real webcam in use


(I hope posting an answer to own question is not against TOS here, I made it because I discovered the solution while writing this post, and extensive googling didn't help, so I hope I can help some people looking for solution.)

Problem: Google chrome / chromium doesn't open v4l2loopback virtual camera device (won't access it) and report "No camera available", even if it is listed and selected in settings page sometimes.

Observed cause of problem: (noticed when using OBS Cam Studio) Google chrome / chromium WILL NOT access (open) virtual camera device if it finds real camera device being in use (busy).


Solution

  • Solution (short version):

    • find out which device your physical webcam is (it may be multiple devices) if your camera is pluggable you can disconnect it, then observe the result of ls /dev/video*, connect it, and try ls /dev/video* again to see which devices appeared (in my case it's /dev/video0 and /dev/video1) - in most cases it will be /dev/video0
    • start your capturing program (the one that uses physical webcam and outputs to virtual camera) and make it output to virtual camera (virtual camera has to be fed with input to be opened by chrome)
    • disable access to physical webcam, which (in my case) can be done with:
    sudo chmod 000 /dev/video0
    sudo chmod 000 /dev/video1
    

    (use the device names that you discovered your physical webcam is)

    • start the video capture in google chrome/chromium (by opening the webpage or pressing some sort of "Start webcam", it depends on the webpage)
    • you should see virtual camera feed in chrome now
    • enable access to physical webcam back, done (in my case) with:
    sudo chmod 660 /dev/video0
    sudo chmod 660 /dev/video1
    
    • and done! have fun camming on the web!

    Solution (long version): Description, step by step, how to make OBS Cam Studio virtual output be visible in google chrome/chromium.

    • if you didn't do it yet, unload v4l2loopback module (do it if you weren't aware of "exclusive_caps" parameter):
    sudo modprobe -r v4l2loopback
    

    (you need to stop any virual camera feed and stop application that uses virtual cam, otherwise you will get modprobe: FATAL: Module v4l2loopback is in use. error)

    • load v4l2loopback module (only "exclusive_caps" parameter matters):
    sudo modprobe v4l2loopback devices=1 video_nr=21 exclusive_caps=1 card_label="Virtual Webcam"
    

    (this command will create one loopback device with name /dev/video21 and name (caption) "Virtual Webcam") simpler version of the command, that really matters:

    sudo modprobe v4l2loopback exclusive_caps=1
    
    • start video capture program that uses your physical webcam and outputs to virtual webcam device (in my case it's OBS Cam Studio) - physical webcam should be busy (in use) now and virtual webcam should be fed input (important)
    • disable physical webcam devices access by (in my case):
    sudo chmod 000 /dev/video0
    sudo chmod 000 /dev/video1
    

    (device names may be different in your case and there may be just one of them) (if you have no sudo access and your camera is pluggable you can just unplug it)

    • start using webcam with google chrome or chromium (enter the web page and open the webcam on it, for example by button "Use my webcam" on the web page - it is different from page to page)
    • you should see the virtual webcam feed now (if not, click the camera icon on the right of address bar, click "Manage" and select your virtual webcam by name in settings, make web page use webcam again)
    • enable physical webcam devices access back by (in my case):
    sudo chmod 660 /dev/video0
    sudo chmod 660 /dev/video1
    

    (in case you unplugged the webcam plug it back and (possibly) reopen it in your program)

    • enjoy virtual webcam in chrome!

    I hope it helps as I struggled for a long time with no effect to make google chrome open virtual webcam in OBS Cam Studio.

    Edited: Found working solution that is based on similar principle, it's here: https://www.scs.stanford.edu/~dm/blog/hide-webcam.html It hides physical webcam from the list of visible webcams, so you need to enter the path to it manually or in the config settings of the program.