如果你在執行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;
?
?
/* 待續?*/
}