在android车机上调试USB Camera录像拍照功能

简介: 在android车机上调试USB Camera录像拍照功能           USB Camera在上一篇文章中已经跑起来了,上次的情况是camera预览可以,拍照、录像不行。

android车机上调试USB Camera录像拍照功能

 

        USB Camera在上一篇文章中已经跑起来了,上次的情况是camera预览可以,拍照、录像不行。除了强制设置视频设备设备文件为/dev/video2,也就是这个usb camera插入系统后自动分配的设备文件,其他没有修改。一拍照或者录像,程序就死了,错误打印如下:

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/sundesheng125原创,转载请注明出处,谢谢!

/*****************************************************************************************************/

01-01 09:33:59.490 V/CAM_FocusManager( 2990): Start autofocus.
01-01 09:33:59.580 V/CAM_PhotoModule( 2990): mAutoFocusTime = 87ms
01-01 09:33:59.650 V/CAM_PhotoModule( 2990): onShutterButtonClic[  263.837941] uvcvideo: Trying format 0x56595559 (YUYV): 960x720.
[  263.837964] uvcvideo: Using default frame interval 66666.6 us (15.0 fps).
k: mCameraState=1
01-01 09:33:59.650 D/V4L2CameraDevice( 1077): in V4L2Camera::TryFmtSize: w: 960, h: 720
01-01 09:33:59.700 D/V4L2CameraDevice( 1077): out V4L2Camera::TryFmtSize: w: 960, h: 720
[  263.897491] uvcvideo: Trying format 0x56595559 (YUYV): 640x480.
01-01 09:33:59.710 D/V4L2CameraDevice( 1077): in V4L2Camera::Try[  263.904745] uvcvideo: Using default frame interval 33333.3 us (30.0 fps).
FmtSize: w: 640, h: 480
01-01 09:33:59.750 D/V4L2CameraDevice( 1077): out V4L2Camera::TryFmtSize: w: 640, h: 480
[  264.008038] Binder_2 used greatest stack depth: 5032 bytes left
01-01 09:33:59.870 D/CameraHardware( 1077): Starting camera for [  264.056815] uvcvideo: Setting frame interval to 1/30 (333333).
picture: NV12(jpeg)[640x480]
01-01 09:33:59.870 D/V4L2CameraDevice( 1077): startDevice, wxh: 640x480, fmt: 0x3231564e
[  264.101826] fuction=uvc_v4l2_do_ioctl, line=793
01-01 09:33:59.910 D/V4L2CameraDevice( 1077): v4l2SetVideoParams[  264.106430] fuction=uvc_v4l2_set_format, line=300
, line: 903, w: 640, h: 480, pfmt: 0x3231564e
01-01 09:33:59.91[  264.116702] fuction=uvc_v4l2_set_format, line=304
0 D/V4L2CameraDevice( 1077): v4l2SetVideoParams, line: 919, mCap[  264.126906] uvcvideo: Trying format 0x56595559 (YUYV): 640x480.
tureFormat: 0x56595559, format.fmt.pix.pixelformat: 0X56595559, [  264.138377] uvcvideo: Using default frame interval 33333.3 us (30.0 fps).
V4L2_PIX_FMT_YUYV: 0x56595559
[  264.173788] uvcvideo: Setting frame interval to 1/15 (666666).
01-01 09:33:59.990 E/V4L2CameraDevice( 1077): VIDIOC_S_FMT Failed: Device or resource busy
[  264.227065] uvcvideo: uvc_v4l2_mmap
01-01 09:34:00.040 E/sunxi_alloc( 1077): can not alloc size 0
[  264.247304] uvcvideo: Device requested 3072 B/frame bandwidth.
[  264.247322] uvcvideo: Selecting alternate setting 6 (3072 B/frame bandwidth).
[  264.251846] uvcvideo: Allocated 5 URB buffers of 32x3072 bytes each.
01-01 09:34:00.080 W/V4L2CameraDevice( 1077): preview thread dose not started
01-01 09:34:00.170 W/V4L2CameraDevice( 1077): preview thread dose not started
01-01 09:34:00.270 W/V4L2CameraDevice( 1077): preview thread dose not started
01-01 09:34:00.380 W/V4L2CameraDevice( 1077): preview thread dose not started
01-01 09:34:00.480 W/V4L2CameraDevice( 1077): preview thread dose not started
01-01 09:34:00.580 W/V4L2CameraDevice( 1077): preview thread dose not started


跟了一下uvcdriver,头很大,代码一大堆,千丝万缕中找到错误出在uvc_v4l2_set_format函数里。又加了一些打印发现错误出在:

     if (uvc_queue_allocated(&stream->queue)) {

            printk("fuction=%s, line=%d\n",__FUNCTION__, __LINE__);
            ret = -EBUSY;
            goto done;

     }

        看了一下uvc_queue_allocated这个接口,发现里面是判断这个queuebuffer size是否大于0,大于0的话就说明已经分配过了,调用uvc_queue_allocated这个接口就会返回true,从而出错出去,会造成camera hal层接着出错。 

       因为在android camera apk应用中一进去就是preview的状态,切到录像或者拍照要另外执行动作,整个处理会有变化,然而可能是因为UVC的设备打开后操作产生的streamqueue没有释放,造成在重现uvc_v4l2_set_format的时候,就会在中间出错跳出,所以笔者稍作了一下改动,在调用uvc_queue_allocated返回出错的地方屏蔽掉,也就是你有这个queue,我就继续用你,理论上应该是可行。重新编译一下,烧进去,一跑,果然可以拍照跟录像了。但是拍的照片有一点小问题,就是在照片中莫名的多了一些短的黑线,预览的时候没有这些短线,笔者还不知道是什么原因。另外笔者还需要研究的是多个usb cameraandroid中看看是否能同时工作,预计这里面有很多工作,还是继续朝着这个方向前进。下面贴修改的代码以及排的一张照片:

static int uvc_v4l2_set_format(struct uvc_streaming *stream,
	struct v4l2_format *fmt)
{
	struct uvc_streaming_control probe;
	struct uvc_format *format;
	struct uvc_frame *frame;
	int ret;

printk("fuction=%s, line=%d\n",__FUNCTION__, __LINE__);
	if (fmt->type != stream->type)
		return -EINVAL;

printk("fuction=%s, line=%d\n",__FUNCTION__, __LINE__);
	
	ret = uvc_v4l2_try_format(stream, fmt, &probe, &format, &frame);
	if (ret < 0)
		return ret;

printk("fuction=%s, line=%d\n",__FUNCTION__, __LINE__);
	mutex_lock(&stream->mutex);

	if (uvc_queue_allocated(&stream->queue)) {
printk("fuction=%s, line=%d\n",__FUNCTION__, __LINE__);
	//	ret = -EBUSY;
	//	goto done;
	}

	memcpy(&stream->ctrl, &probe, sizeof probe);
	stream->cur_format = format;
	stream->cur_frame = frame;
printk("fuction=%s, line=%d\n",__FUNCTION__, __LINE__);

done:
	mutex_unlock(&stream->mutex);
	return ret;
}


 

目录
相关文章
|
7月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
246 3
|
7月前
|
缓存 Unix Android开发
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
773 8
|
7月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
640 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
396 1
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
698 0
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
1949 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
657 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
658 8
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
1250 0
安卓系统调试与优化:(一)bootchart 的配置和使用