如果你在执行VIDIOC_DQBUF突然提示以下错误:
error: VIDIOC_DQBUF: Resource temporarily unavailable
那么很可能是你使用非阻塞方式打开设备文件的造成的。
Resource temporarily unavailable是一种EAGAIN的错误。EAGAIN是较常见的一种错误(比如用在非阻塞操作中),从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。例如,以O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返回,read函数会返回一个错误EAGAIN,提示你的应用程序现在没有数据可读请稍后再试。(其实这样的错误一改是可以会略才对,也只有用非阻塞方式打开文件时会出现此类错误)。
因此建议 V4L2编程中使用阻塞方式打开一个设备文件,除非你能保重开始采集数据时队列里的n块缓存已有数据存在。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1、建议 V4L2编程中使用阻塞方式打开一个设备文件,除非你能保重开始采集数据时队列里的n块缓存已有数据存在。
倘若使用非阻塞,则会出现BUG:
VIDIOC_DQBUF
failed.
:
Resource
temporarily
unavailable
2、视频格式化测试成功代码:
struct v4l2_format fmt;//设置获取视频的格式
memset( &fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;//视频数据流类型,永远都是V4L2_BUF_TYPE_VIDEO_CAPTURE
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;//视频源的格式为JPEG或YUN4:2:2或RGB
fmt.fmt.pix.width = 600;//设置视频宽度
fmt.fmt.pix.height = 480;//设置视频高度
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;//具体不知道干嘛的,貌似重要
if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0)//使配置生效
{
printf("set format failed\n");
return -1;
/* 待续*/
}
分享到:
相关推荐
IMX8 mini mipi 摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device) 需要在内核的驱动代码中去实现相关函数。
// [hawkview_err]xxxxcan't open /dev/video0(Resource temporarily unavailable) // 2016/10/25 14:33 wenyuanbo cloase suspend. // register_early_suspend(&dev->early_suspend); vfe_print("register_...
使用V4L2实现摄像头的视频读取,为提高视频刷新速度,采用了freambuffer实现视频的显示,比直接用QT lable显示快一个等级。 因需要在嵌入式运行,QT已配置好交叉编译环境,所以代码使用了qt的工程。如果不使用qt可...
摄像头gc2145资料,寄存器初始化配置、数据手册,C
Linux下面接4个USB Camera 出现:VIDIOC_STREAMON: No space left on device,新patch解决了这个问题,欢迎下载!
} /* * 这里要将struct v4l2_format结构体置零,然后将 * format.type设定为V4L2_BUF_TYPE_VIDEO_CAPTURE, * 这样在进行 VIDIOC_G_FMT 的ioctl时,驱动就会知 * 道是在捕获视频的情形下获取格式的内容。
ioctl VIDIOC_ENCODER_CMD,VIDIOC_TRY_ENCODER_CMD - 执行编码器命令 ioctl VIDIOC_ENUMAUDIO - 枚举音频输入 ioctl VIDIOC_ENUMAUDOUT - 枚举音频输出 ioctl VIDIOC_ENUM_FMT - 枚举图像格式
opencv 依赖libv4l来打开摄像头,不然会报HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP
#define V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200 /* Can do video output overlay */ #define V4L2_CAP_HW_FREQ_SEEK 0x00000400 /* Can do hardware frequency seek */ #define V4L2_CAP_RDS_OUTPUT 0x00000800 ...
// [hawkview_err]xxxxcan't open /dev/video0(Resource temporarily unavailable) // 2016/10/25 14:33 wenyuanbo cloase suspend. // register_early_suspend(&dev->early_suspend); vfe_print("register_...
操作/dev/video,此demo仅提供开发思路,本人测试时无法打开video1,报VIDIOC_S_FMT error 16, Device or resource busy
2 取得设备的capability 看看设备具有什么功能 比如是否具有视频输入 或者音频输入输出等 VIDIOC QUERYCAP struct v4l2 capability 3 选择视频输入 一个视频设备可以有多个视频输入 VIDIOC S INPUT struct v4l2 ...
NULL 博文链接:https://ivan-yan.iteye.com/blog/1466080
通过摄像头,利用V4L进行编程实现图象的采集与保存。程序中的摄像头的输出图像jpeg格式,如果未rgb或者其他格式写文件的时候需要自己写文件头。不要骂我,程序是我自己写的,并通过调式运行成功。不懂的自己百度。我...
一、源码test.c #include #include #include #include int main(){ ////// int fd = open(/dev/video0,O_RDWR);... printf(TK——->>>fd... ioctl(fd,VIDIOC_QUERYCAP,∩); printf(TK———->>
解决多个摄像头VIDIOC_STREAMON: No space left on device的uvc驱动
ret = ioctl(videofh, VIDIOC_DQBUF, &buf;); if (ret == -1) { hv_err("VIDIOC_DQBUF failed!\n"); goto stream_off; } float framerate; framerate = get_framerate((long long)(buf.timestamp.tv_sec),...