gstreamer随手记

gstreamer随手记 pixelformatY12 ’ — 像素格式Y12 是 V4L2 定义的 FourCC 编码表示 12位灰度图像格式V4L2_PIX_FMT_Y12。每个像素占 16位2字节其中低12位存储有效灰度数据高4位未使用填零。末尾的空格 Y12 ’ 是因为 V4L2 的 FourCC 固定为 4个字符Y12 只有3个字符需要用空格补齐。在本项目中的意义红外相机MWIR/SWIR/LWIR传感器输出的是 12位灰度数据所以采用 Y12 格式。从 pipelines.yaml 第19行也可以看到下游 GStreamer 用 gray16-le16位小端灰度来解析与 Y12 的存储方式一致。–stream-mmap4 — 内存映射缓冲区数量–stream-mmap 指定使用 MMAP内存映射 方式进行视频流采集。4 表示分配 4个缓冲区。工作原理内核驱动预先分配4块内存缓冲区采集时轮流使用——驱动往一个缓冲区写数据的同时用户空间可以读取另一个缓冲区的数据形成流水线式并行处理。为什么是4个相比默认值通常是3个4个缓冲区提供了更大的缓冲余量可以在用户空间处理速度波动时减少丢帧风险对实时性要求较高的红外相机采集尤为重要。–set-fmt-videowidth1280,height512,pixelformatGREY但是 GStreamer 又把它解释成640×512、16位灰度图这是因为驱动表面输出1280个8位数据程序实际解释640个16位像素也就是把相邻两个字节拼成一个红外像素。这通常是驱动为了传输 14/16 位红外数据所采用的特殊包装方式。可以把 GStreamer 想象成一条视频加工流水线。摄像头 → 格式转换 → H.264编码 → UDP发送在 GStreamer 中写成v4l2src ! videoconvert ! mpph264enc ! multiudpsink! 表示把前一个工位的输出交给下一个工位。GStreamer → appsink → PythonPython → appsrc → GStreamer