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;
}
其中传入的device字符串是绝对路径,比如"/dev/video0"
这里是在jni代码中判断,其实也是可以在更下的C++底层判断。
重要的是里面判断节点属性支持的格式代码,这个是关键点。
共勉:每天进步一点也能取得巨大进步。
|