Android 底层判断/dev/video节点是否是可用摄像头
峥嵘life
于 2021-09-05 18:02:33 发布
阅读量3.7k
收藏 5
点赞数 3
分类专栏: Camera android 文章标签: android
版权
android 同时被 2 个专栏收录
419 篇文章 58 订阅
订阅专栏
Camera
7 篇文章 2 订阅
订阅专栏
Android 底层判断/dev/video节点是否是可用摄像头
Android设备Camera节点数据是存在/dev/下面的,
比如有设备三个摄像头/dev目录会有下面的节点名称:video0、video1、video2
Android 设备插入Usb摄像头时,会有出现有些设备存在多个video节点,但是并不是所有的节点都能显示预览
Android java的java代码是无法用读取文件的方式进行video节点信息进行读取
但是可以C++代码进行open,根据返回的数值判断是否是支持Camera预览的节点。
代码如下:
/frameworks/base/services/core/jni/com_android_server_camera_CameraServiceProxy.cpp
static bool isSupportCameraDevice(const char* device) {
ALOGD("is support device = %s", device);
struct v4l2_fmtdesc fmt;
fmt.index = 0;
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
int fd = open(device, O_RDWR);
ALOGD("is support device fd = %d", fd);
if (fd < 0) {
return false;
}
while(ioctl(fd, VIDIOC_ENUM_FMT, &fmt) == 0) {
ALOGD("is support device = %c %c %c %c",
(fmt.pixelformat) & 0xFF, (fmt.pixelformat >> 8) & 0xFF,
(fmt.pixelformat >> 16) & 0xFF, (fmt.pixelformat >> 24) & 0xFF);
// 重点:
if ( SUPPORT_FORMAT(fmt.pixelformat, "YUYV")
|| SUPPORT_FORMAT(fmt.pixelformat, "yuyv")
|| SUPPORT_FORMAT(fmt.pixelformat, "MJPG")
|| SUPPORT_FORMAT(fmt.pixelformat, "mjpg")) {
ALOGD("is support device true");
int fdColde = close(fd);
ALOGD("is support device fdColde = %d", fdColde);
return true;
}
fmt.index;
}
int fdColde2 = close(fd);
ALOGD("is support device fdColde2 = %d", fdColde2);
return false;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
其中传入的device字符串是绝对路径,比如"/dev/video0"
这里是在jni代码中判断,其实也是可以在更下的C++底层判断。
重要的是里面判断节点属性支持的格式代码,这个是关键点
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/wenzhi20102321/article/details/120118593