📅  最后修改于: 2023-12-03 15:20:56.028000             🧑  作者: Mango
V4L2 (Video4Linux2) 是一个提供基于 Linux 内核的多种视频设备及其对应的驱动程序统一接口的 API。
V4L2 的核心是视频设备驱动程序。驱动程序通常负责处理视频设备的硬件细节,这包括缓冲区、帧大小、图像格式等。程序员使用 V4L2 接口和驱动程序交互来控制视频设备。V4L2 接口在内核空间与驱动程序交互,同时也在用户空间提供了相应的操作 API。
V4L2 可用于多种视频设备,包括网络摄像头、USB 摄像头、视频采集卡等。V4L2 也可用来控制硬件编解码器,通过使用 V4L2,开发者可以编写自己的视频采集程序、视频压缩/解压缩程序,以及视频呈现程序。
下面是一个使用 V4L2 接口的简单摄像头程序示例(使用 Python 编写):
import v4l2
import fcntl
import mmap
# Open the video device.
video = open('/dev/video0', 'r')
# Configure the video device.
streamformat = v4l2.v4l2_format()
streamformat.type = v4l2.V4L2_BUF_TYPE_VIDEO_CAPTURE
streamformat.fmt.pix.field = v4l2.V4L2_FIELD_ANY
streamformat.fmt.pix.width = 640
streamformat.fmt.pix.height = 480
streamformat.fmt.pix.pixelformat = v4l2.V4L2_PIX_FMT_YUYV
fcntl.ioctl(video, v4l2.VIDIOC_S_FMT, streamformat)
# Allocate video buffers.
buffers = []
for i in range(4):
buffer = v4l2.v4l2_buffer()
buffer.type = v4l2.V4L2_BUF_TYPE_VIDEO_CAPTURE
buffer.memory = v4l2.V4L2_MEMORY_MMAP
buffer.index = i
fcntl.ioctl(video, v4l2.VIDIOC_QUERYBUF, buffer)
memory = mmap.mmap(video.fileno(), buffer.length, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE, offset=buffer.m.offset)
buffers.append(memory)
# Start video capture.
for buffer in buffers:
fcntl.ioctl(video, v4l2.VIDIOC_QBUF, buffer)
type = v4l2.V4L2_BUF_TYPE_VIDEO_CAPTURE
fcntl.ioctl(video, v4l2.VIDIOC_STREAMON, type)
# Read video frames.
for i in range(10):
buffer = v4l2.v4l2_buffer()
buffer.type = v4l2.V4L2_BUF_TYPE_VIDEO_CAPTURE
buffer.memory = v4l2.V4L2_MEMORY_MMAP
fcntl.ioctl(video, v4l2.VIDIOC_DQBUF, buffer)
data = buffers[buffer.index]
frame = data[0:buffer.bytesused]
fcntl.ioctl(video, v4l2.VIDIOC_QBUF, buffer)
# Stop video capture.
fcntl.ioctl(video, v4l2.VIDIOC_STREAMOFF, type)
# Close the video device.
video.close()
这段代码通过 V4L2 接口打开一个视频设备,并对其进行初始化和配置,然后开启视频捕获,并读取视频帧。