前言

笔者计划通过虚拟摄像头系列文章、让读者完整掌握在android系统中实现过程和应用方法。以作备忘之用、再则让有需求朋友可以参考。

第一步 移植 v4l2loopback 驱动至 android的 linux 内核

在kernel/driver/ 创建 virtual_camera 文件夹,内容结构如下:

robot@ubuntu:~/android_build/vendor/nxp-opensource/kernel_imx/drivers/virtual_camera$ tree -L 1
.
|-- Makefile
|-- v4l2loopback.c
|-- v4l2loopback.h
`-- v4l2loopback_formats.h

编写 Makefile 文件,编译 v4l2loopback.ko 模块驱动涉及文件内容如下:

include Kbuild
ifeq ($(KBUILD_MODULES),)#KERNELRELEASE  ?= `uname -r`
#KERNEL_DIR ?= /lib/modules/$(KERNELRELEASE)/build
ARCH=arm64
KERNEL_DIR=/home/robot/android_build/vendor/nxp-opensource/kernel_imx
CROSS_COMPILE=/home/robot/android_build/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-PWD     := $(shell pwd)PREFIX ?= /usr/local
BINDIR  = $(PREFIX)/bin
MANDIR  = $(PREFIX)/share/man
MAN1DIR = $(MANDIR)/man1
INSTALL = install
INSTALL_PROGRAM = $(INSTALL) -p -m 755
INSTALL_DIR     = $(INSTALL) -p -m 755 -d
INSTALL_DATA    = $(INSTALL) -m 644MODULE_OPTIONS = devices=2##########################################
# note on build targets
#
# module-assistant makes some assumptions about targets, namely
#  <modulename>: must be present and build the module <modulename>
#                <modulename>.ko is not enough
# install: must be present (and should only install the module)
#
# we therefore make <modulename> a .PHONY alias to <modulename>.ko
# and remove utils-installation from 'install'
# call 'make install-all' if you want to install everything
##########################################.PHONY: all install clean distclean
.PHONY: install-all install-utils install-man
.PHONY: modprobe v4l2loopback# we don't control the .ko file dependencies, as it is done by kernel
# makefiles. therefore v4l2loopback.ko is a phony target actually
.PHONY: v4l2loopback.ko utilsall: v4l2loopback.ko utilsv4l2loopback: v4l2loopback.ko
v4l2loopback.ko:@echo "Building v4l2-loopback driver..."$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modulesinstall-all: install install-utils install-man
install:$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules_install@echo ""@echo "SUCCESS (if you got 'SSL errors' above, you can safely ignore them)"@echo ""install-utils: utils/v4l2loopback-ctl$(INSTALL_DIR) "$(DESTDIR)$(BINDIR)"$(INSTALL_PROGRAM) $< "$(DESTDIR)$(BINDIR)"install-man: man/v4l2loopback-ctl.1$(INSTALL_DIR) "$(DESTDIR)$(MAN1DIR)"$(INSTALL_DATA) $< "$(DESTDIR)$(MAN1DIR)"clean:rm -f *~rm -f Module.symvers Module.markers modules.order$(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean$(MAKE) -C utils cleandistclean: cleanrm -f man/v4l2loopback-ctl.1modprobe: v4l2loopback.kochmod a+r v4l2loopback.kosudo modprobe videodev-sudo rmmod v4l2loopbacksudo insmod ./v4l2loopback.ko $(MODULE_OPTIONS)man/v4l2loopback-ctl.1: utils/v4l2loopback-ctlhelp2man -N --name "control v4l2 loopback devices" \--no-discard-stderr --help-option=-h --version-option=-v \$^ > $@utils: utils/v4l2loopback-ctl
utils/v4l2loopback-ctl: utils/v4l2loopback-ctl.c$(MAKE) -C utils.clang-format:curl "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/.clang-format" > $@.PHONY: clang-format
clang-format: .clang-formatclang-format -i *.c *.h utils/*.cendif # !kbuild

此Makefile使用源码中文件,仅修改交叉编译工具内容。

第二步 在 kernel/driver/Makefile 中添加增加的 v4l2loopback 设备:

增加新增设备

obj-$(CONFIG_MULTIPLEXER)       += mux/
obj-y                           += virtual_camera/

编译输出内容如下:

robot@ubuntu:~/android_build/out/target/product/mek_8q/obj/KERNEL_OBJ$ ls drivers/virtual_camera/
built-in.o  modules.builtin  modules.order  v4l2loopback.ko  v4l2loopback.mod.c  v4l2loopback.mod.o  v4l2loopback.o

再次编译android源码后,v4l2loopback.ko 内核模块就添加打包至kernel.img的镜像中。

第三步 加载并启动 v4l2loopback.ko 模块

@device/fsl/imx8q/mek_8q/BoardConfig.mk 文件中包含 v4l2loopback.ko

BOARD_VENDOR_KERNEL_MODULES += \$(KERNEL_OUT)/drivers/net/wireless/qcacld-2.0/wlan.ko \$(KERNEL_OUT)/drivers/virtual_camera/v4l2loopback.ko

@device/fsl/imx8q/mek_8q/init.rc 文件中增加insmod v4l2loopback.ko

on bootstart audioserverstart mediadrmstart mediastart drmchmod 0777 /vendor/lib/modules/v4l2loopback.koinsmod /vendor/lib/modules/v4l2loopback.ko

第四步 验证 v4l2loopback.ko 模块是否加载成功

未加载 v4l2loopback.ko ,设备dev目录的video如下:

mek_8q:/ # rmmod vendor/lib/modules/v4l2loopback.ko
mek_8q:/ # ls /dev
FreescaleAccelerometer block           event-log-tags gpiochip2 hwbinder iio:device0  memory_bandwidth   ppp    shm    tty10 tty18 tty25 tty32 tty4  tty47 tty54 tty61  ttyLP3   uinput        vga_arbiter video4
FreescaleGyroscope     console         fd             gpiochip3 i2c-1    input        mxc_asrc           pps0   snd    tty11 tty19 tty26 tty33 tty40 tty48 tty55 tty62  ttyS0    urandom       vhci        vndbinder
FreescaleMagnetometer  cpu_dma_latency fscklogs       gpiochip4 i2c-2    ion          mxc_hifi4          ptmx   socket tty12 tty2  tty27 tty34 tty41 tty49 tty56 tty63  ttyS1    usb-ffs       video0      watchdog
__properties__         cpuctl          full           gpiochip5 i2c-3    isoc         mxc_mem            ptp0   stune  tty13 tty20 tty28 tty35 tty42 tty5  tty57 tty7   ttyS2    usb_accessory video1      watchdog0
ashmem                 cpuset          fuse           gpiochip6 i2c-4    kmsg         mxc_sim            pts    sync   tty14 tty21 tty29 tty36 tty43 tty50 tty58 tty8   ttyS3    vcs           video12     xt_qtaguid
async                  ctrl            galcore        gpiochip7 i2c-5    kvm          network_latency    random tty    tty15 tty22 tty3  tty37 tty44 tty51 tty59 tty9   tun      vcs1          video13     zero
autofs                 device-mapper   gpiochip0      graphics  i2c-6    loop-control network_throughput rfkill tty0   tty16 tty23 tty30 tty38 tty45 tty52 tty6  ttyLP0 ubi_ctrl vcsa          video2
binder                 dri             gpiochip1      hw_random i2c-7    memcg        null               rtc0   tty1   tty17 tty24 tty31 tty39 tty46 tty53 tty60 ttyLP1 uhid     vcsa1         video3

加载 v4l2loopback.ko ,设备dev目录的video如下:

mek_8q:/ # insmod vendor/lib/modules/v4l2loopback.ko
mek_8q:/ # ls /dev/
FreescaleAccelerometer block           event-log-tags gpiochip2 hwbinder iio:device0  memory_bandwidth   ppp    shm    tty10 tty18 tty25 tty32 tty4  tty47 tty54 tty61  ttyLP3   uinput        vcsa1       video3
FreescaleGyroscope     console         fd             gpiochip3 i2c-1    input        mxc_asrc           pps0   snd    tty11 tty19 tty26 tty33 tty40 tty48 tty55 tty62  ttyS0    urandom       vga_arbiter video4
FreescaleMagnetometer  cpu_dma_latency fscklogs       gpiochip4 i2c-2    ion          mxc_hifi4          ptmx   socket tty12 tty2  tty27 tty34 tty41 tty49 tty56 tty63  ttyS1    usb-ffs       vhci        video5
__properties__         cpuctl          full           gpiochip5 i2c-3    isoc         mxc_mem            ptp0   stune  tty13 tty20 tty28 tty35 tty42 tty5  tty57 tty7   ttyS2    usb_accessory video0      vndbinder
ashmem                 cpuset          fuse           gpiochip6 i2c-4    kmsg         mxc_sim            pts    sync   tty14 tty21 tty29 tty36 tty43 tty50 tty58 tty8   ttyS3    v4l2loopback  video1      watchdog
async                  ctrl            galcore        gpiochip7 i2c-5    kvm          network_latency    random tty    tty15 tty22 tty3  tty37 tty44 tty51 tty59 tty9   tun      vcs           video12     watchdog0
autofs                 device-mapper   gpiochip0      graphics  i2c-6    loop-control network_throughput rfkill tty0   tty16 tty23 tty30 tty38 tty45 tty52 tty6  ttyLP0 ubi_ctrl vcs1          video13     xt_qtaguid
binder                 dri             gpiochip1      hw_random i2c-7    memcg        null               rtc0   tty1   tty17 tty24 tty31 tty39 tty46 tty53 tty60 ttyLP1 uhid     vcsa          video2      zero

设备 video5 就是 v4l2loopback.ko 模块驱动的设备,至此 v4l2loopback.ko 模块移植成功。

接下来我们将把此设备配置为前置或后置摄像头、并配置sensor相关属性信息,以此通过android用户空间程序调用此虚拟摄像头实现拍照。

虚拟摄像头之一: android8.1 移植 v4l2loopback 虚拟摄像头相关推荐

  1. 虚拟摄像头之 十二 v4l2loopback虚拟机摄像头移植实战(完结篇)

    前言 本篇记录在 android8 的 IMX8QM 平台移植 v4l2loopback 虚拟摄像头实战过程记录;其中主旨是记录整个过程.已经期间出现的踩坑过程,后期虚拟摄像驱动还有移植到多核ARM平 ...

  2. 云手机的虚拟手机服务器是什么意思,云虚拟手机服务器挂机

    云虚拟手机服务器挂机 内容精选 换一换 当您拥有一台专属主机后,您可以在专属主机上创建相应规格族的云服务器.在专属主机上创建云服务器前,您必须先完成以下工作:购买专属主机如果不使用系统自动创建的默认安 ...

  3. 【VirtualBox】VirtualBox使用现有的虚拟盘文件(如VHD)创建虚拟机时,报错:打开虚拟硬盘失败,“UUID already exist”的解决方法

    ###0.问题描述 使用现有的虚拟盘文件(如VHD)创建虚拟机时,报错:打开虚拟硬盘失败,"UUID already exists"的错误. ###1.参考博客 https://w ...

  4. Linux 虚拟化网络技术 — 虚拟二层网卡(Tap)与虚拟三层隧道网卡(Tun)

    目录 文章目录 目录 虚拟二层网卡(Tap)与虚拟三层隧道网卡(Tun) tap/tun 作为用户空间与内核空间的数据传输通道 tap/tun 与内核网络协议栈的数据传输 虚拟二层网卡(Tap)与虚拟 ...

  5. 怎样把台式机变成虚拟服务器,怎么把文件传到虚拟主机

    怎么把文件传到虚拟主机?通过云服务运营商提供的管理面板进行文件管理并上传,或者是通过FTP软件来把文件传到虚拟主机. 我们在购买一个虚拟主机后,云服务商会提供一个管理面板(一般是集成在用户中心里).F ...

  6. 拳王虚拟项目公社:虚拟商品全自动化赚钱技术,虚拟产品自动赚钱能信吗?虚拟资源教程

    拳王一直都在说虚拟项目是互联网的主流项目,其低成本高价值,受到了众多互联网从业者的追捧. 很多人愿意做虚拟项目的原因,无非是因为他的价值高,成本低,复制性比较强,很容易掌握整个流程,而且售后维护也比较 ...

  7. 拳王虚拟项目公社:2020主流的虚拟资源项目,最新最全自动化系统玩法

    拳王一直都在说虚拟项目是互联网的主流项目,其低成本高价值,受到了众多互联网从业者的追捧. 很多人愿意做虚拟项目的原因,无非是因为他的价值高,成本低,复制性比较强,很容易掌握整个流程,而且售后维护也比较 ...

  8. 如何在ESXi5.1上运行一个虚拟的ESXi虚拟机并且在这个虚拟的ESXi虚拟机里运行64位的系统?...

    如何在ESXi5.1上运行一个虚拟的ESXi虚拟机并且在这个虚拟的ESXi虚拟机里运行64位的系统? 这个虚拟的ESXi虚拟机也叫作嵌入式ESXi,目前这个功能是一个体验版,仅用于测试或者教学演示用, ...

  9. android 虚拟按键自定义,如何适配Android底部虚拟按键

    前言 本文章只做一个记录,一个备忘,也为了更好的帮助他人,文章参考地址:Android适配底部虚拟按键的方法 问题说明 项目进行中需要透明渐变的状态栏,全屏显示,当然透明渐变好弄,方法有很多,但是如果 ...

  10. 云虚拟主机bch 和 云服务器bcc,虚拟主机bch和云服务器bcc

    虚拟主机bch和云服务器bcc 内容精选 换一换 云服务器创建后区域固定,不能将云服务器转移到另一个区域,也不能将云服务器转移到另一个帐号.您可以通过镜像迁移方式实现云服务器的跨帐号跨区域迁移.服务器 ...

最新文章

  1. win10 调用计算机,Win10系统打开此电脑提示正在处理它解决方法
  2. C++:运算符重载函数之成员运算符重载函数
  3. tomcat 修改默认访问根目录
  4. 水杯测试----误人子弟啊!
  5. Resource 资源 ---Day09 2014-06-13
  6. 图解全排列问题_一道笔试题(122345求有条件全排列)的两种做法
  7. pat 乙级 1003 我要通过!(C++)
  8. Judy alpha 第七天
  9. 谈谈Groovy闭包
  10. idea自动构建web项目_构建Web应用程序以自动执行系统管理员任务
  11. 回馈顾客, 活动搞起 --- 策略模式
  12. 开源大数据周刊-第46期
  13. List集合去重的常见几种方式
  14. 正则 纳税号_正则表达式号码靓号类型判断代码
  15. Codeforces Round #708 (Div. 2)B. M-arrays
  16. android改变系统语言,Android 9.0设置系统语言
  17. 二十七、prometheus部署安装配置告警
  18. 汽车专用示波器检测喷油嘴(汽油机)波形信号及分析
  19. AWK程序设计语言-翻译
  20. 什么是JDBC,JDBC如何使用?

热门文章

  1. 2021年高处安装、维护、拆除考试及高处安装、维护、拆除考试题
  2. google地图图标 google map图库资源
  3. 北京因地制宜编制村庄规划 着重体现京韵农味
  4. 公司官网建站笔记(六):域名进行公安备案并将备案号显示在网页底部
  5. JavaEE | 泛型
  6. php wordpressCMS 网站局域网搭建--笔记
  7. 趋势交易大师php,大道至简——多级别均线共振交易系统
  8. STM32f407程序移植到GD32F407
  9. 左手手型投篮姿势教程
  10. java spring登录验证_详解使用Spring Security进行自动登录验证