1.现象

使用Qt调用摄像头的程序(测试Qt摄像头https://github.com/HXBJ1737/Linux_Qt_app

或者执行gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! kmssink

来调用摄像头时会分别出现CameraBin error: "Failed to allocate required memory."CameraBin error: "Failed to allocate required memory."

并且是概率问题,我使用的是下图这种OV5695,不知道官方使用的那种OV5695有没有这种问题。

一个简单的方法是重启大概率解决,但不稳定

2.研究

通过查询设备树,可以看到OV5695的i2c地址是0x36,使用i2cdetect -y 4

正常情况下得到的

失败情况下得到的

于是我用串口看上电打印的log,发现

正常情况下

失败情况下

可以发现不论失败还是成功,0x36都能检测到,于是查看linux_sdk\kernel\drivers\media\i2c\ov5695.c 驱动代码

可以发现,ov5695_check_sensor_id()函数会用于检查摄像头的id,比如OV5695的CHIP_ID就是5695,但如果没检测到,就会goto到err_power_off执行下面的三个语句,销毁释放摄像头的一切资源。

3.解决

一个简单的方法是直接注释这个goto 语句(linux_sdk\kernel\drivers\media\i2c\ov5695.c

经验证,即使这个函数没有正确返回,也不影响摄像头i2c地址读取,

可以看到,即使下图未能正确读取sensor id,返回-5,但仍然能检测到i2c的0x36地址。

image-AnxW.png

并且执行gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 ! kmssink

也可以正常显示