You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用libpipewire获取屏幕截图?格式转换及示例咨询

使用libpipewire捕获屏幕画面及格式转换指南

一、是否可以用libpipewire捕获屏幕?

完全可以。PipeWire原生支持屏幕捕获,你参考的tutorial5是针对摄像头的捕获示例,只需调整节点选择逻辑,就能切换到屏幕输出节点进行捕获。

二、libpipewire捕获的视频/截图格式

libpipewire捕获的是未压缩的原始像素数据,常见格式包括RGB系列(如RGBx)、YUV系列(如YUY2、NV12),具体取决于你在格式协商阶段指定的参数,这些都是底层处理的原生格式,并非PNG/JPG这类封装后的图片格式。

三、转换为PNG/JPG等格式的核心步骤

要将原始像素数据转为标准图片格式,需要借助图像编码库或多媒体工具处理,流程如下:

  1. 从PipeWire的帧缓冲区中读取原始像素数据
  2. 将原始像素格式转换为编码库支持的格式(比如将RGBx转为纯RGB)
  3. 使用libpng、libjpeg这类库将转换后的像素数据写入对应格式的文件

四、示例代码片段

1. 调整PipeWire节点选择逻辑(切换到屏幕节点)

在tutorial5的基础上,修改节点过滤函数,匹配屏幕输出节点:

static bool filter_screen_node(const struct pw_node_info *info, void *data) {
    const char *media_type = pw_properties_get(info->props, PW_KEY_MEDIA_TYPE);
    const char *media_category = pw_properties_get(info->props, PW_KEY_MEDIA_CATEGORY);
    // 筛选屏幕输出类型的节点
    return media_type && !strcmp(media_type, "Video") &&
           media_category && !strcmp(media_category, "Screen");
}

2. 将捕获的RGBx帧保存为PNG(使用libpng)

假设已获取到宽为width、高为height的RGBx格式帧数据,缓冲区为frame_data:

#include <png.h>
#include <stdlib.h>
#include <stdio.h>

void save_rgbx_to_png(const uint8_t *frame_data, int width, int height, const char *output_path) {
    FILE *fp = fopen(output_path, "wb");
    if (!fp) return;

    png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    png_infop info_ptr = png_create_info_struct(png_ptr);

    png_init_io(png_ptr, fp);
    // 设置PNG文件参数:RGB格式、8位颜色深度
    png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB,
                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
    png_write_info(png_ptr, info_ptr);

    // 处理RGBx转RGB(丢弃alpha通道)
    png_bytep row_pointers[height];
    for (int i = 0; i < height; i++) {
        row_pointers[i] = malloc(width * 3);
        const uint8_t *src = frame_data + i * width * 4;
        uint8_t *dst = row_pointers[i];
        for (int j = 0; j < width; j++) {
            dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2];
            src += 4; dst += 3;
        }
    }

    png_write_image(png_ptr, row_pointers);
    png_write_end(png_ptr, NULL);

    // 清理资源
    for (int i = 0; i < height; i++) free(row_pointers[i]);
    png_destroy_write_struct(&png_ptr, &info_ptr);
    fclose(fp);
}

五、参考方向

  • PipeWire官方文档中关于pw_stream和缓冲区处理的章节,重点学习帧数据获取与格式协商逻辑
  • libpng、libjpeg官方文档,掌握像素数据编码为标准图片的流程
  • 参考wf-recorder(基于PipeWire的屏幕录制工具)的源码,它完整实现了屏幕捕获与格式转换的全流程

内容的提问来源于stack exchange,提问作者ibse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:27:10