基于安卓9.0系统,简单实现打开摄像头并获取视频流数据。
以下例子是C++代码,可以做成jni so库方式给安卓应用程序使用,获取到视频数据用OpenGL方式显示出来。
1、打开摄像头
摄像头设备为:/dev/video0
//打开摄像头 deviceName为/dev/video0
if ((fd = open(deviceName, O_RDWR, 0)) < 0){
return false;
}
2、查询视频设备的能力,是否具有视频输入,或者音频输入功能
VIDIOC_QUERYCAP
v4l2_capability caps;
{
if (ioctl(fd, VIDIOC_QUERYCAP, &caps) < 0) {
ALOGE("V4l2Capture::%s,failed to get device caps for %s (%d = %s)",__func__,deviceName, errno, strerror(errno));
close(fd);
return false;
}
// Report device properties
ALOGI("V4l2Capture::%s,Open Device: %s (fd=%d)",__func__ , deviceName, fd);
ALOGI(" Driver: %s", caps.driver);
ALOGI(" Card: %s", caps.card);
ALOGI(" Version: %u.%u.%u",(caps.version >> 16) & 0xFF,(caps.version >> 8) & 0xFF,(caps.version) & 0xFF);
ALOGI(" All Caps: %08X", caps.capabilities);
ALOGI(" Dev Caps: %08X", caps.device_caps);
}
3、查询或者设置视频的制式或者帧格式
VIDIOC_ENUM_FMT
v4l2_fmtdesc formatDescriptions;
formatDescriptions.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
{
for (int i=0; true; i++) {
formatDescriptions.index = i;
// query supported format
if (ioctl(fd, VIDIOC_ENUM_FMT, &formatDescriptions) == 0) {
ALOGI("V4l2Capture::%s, %2d: %s 0x%08X 0x%X",__func__,i,formatDescriptions.description,formatDescriptions.pixelformat,formatDescriptions.flags);
}else {
// No more formats available
break;
}
}
// Verify we can use this device for video capture
if (!(caps.capabilities & V4L2_CAP_VIDEO_CAPTURE_MPLANE) ||
!(caps.capabilities & V4L2_CAP_STREAMING)) {
// Can't do streaming capture.
ALOGE

本文介绍在安卓9.0系统下,利用C++和V4L2 API实现摄像头视频流数据采集的方法。从打开摄像头设备,到查询设备能力、设置视频格式和帧率,再到申请和管理缓冲区,最后进行视频流采集和停止流程,提供了详细的步骤和代码示例。
最低0.47元/天 解锁文章
1165

被折叠的 条评论
为什么被折叠?



