Android P摄像头开发和V4l2视频处理

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

基于安卓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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值