🧩 一、appsink 是什么?

appsink 是 GStreamer 提供的一个 应用程序可控的接收端(sink)元素,用于将 pipeline 处理后的原始数据(如音视频帧)传递给应用程序代码。它是连接 GStreamer 流水线与用户逻辑的关键桥梁。

  • 用途:从 pipeline 中提取 GstBuffer 或封装好的 GstSample(含 buffer + caps + timestamp)
  • 典型场景:AI 推理输入、截图、自定义渲染、内存保存、测试验证等
  • 方向:数据流终点(Sink),只接收上游数据

📦 二、基础信息(来自 Factory & Plugin Details)

项目
Long-nameAppSink
KlassGeneric/Sink
DescriptionAllow the application to get access to raw buffer
AuthorsDavid Schleef, Wim Taymans
Pluginappgstapp.dll
Version1.18.6
LicenseLGPL
Sourcegst-plugins-base

✅ 属于官方基础插件,稳定可靠,跨平台支持良好。


🔌 三、Pad 与 Caps 支持

  • Pad Templatesink
    • Availability: Always(始终存在)
    • CapabilitiesANY
      • 表示可接收任意格式的数据
      • ⚠️ 但强烈建议通过 caps 属性显式限制格式(如 video/x-raw, format=BGR),避免应用层处理未知格式导致崩溃

⚙️ 四、Element Properties(属性详解)

以下是 appsink 所有可配置属性及其含义(按功能分类):

1. 核心控制属性

属性类型默认值说明
emit-signalsgbooleanfalse是否启用信号机制。设为 true 后,当新 preroll/sample 到达时会触发 new-prerollnew-sample 信号(事件驱动模式必需)。
capsGstCaps*NULL限制输入数据格式。例如:video/x-raw, width=640, height=480, format=RGB。必须设置以确保应用能正确解析数据。
enable-last-samplegbooleantrue是否维护 last-sample 属性(可用于随时查询最后一帧)。
last-sampleGstSample*只读。返回最近接收到的一个 sample(包含 buffer、caps、pts/dts 等)。
eosgbooleantrue只读。指示是否已收到 EOS(End-of-Stream)或尚未开始。

2. 缓冲与队列控制

属性类型默认值说明
max-buffersguint0(无限制)内部队列最多缓存多少个 buffer。设为 1 可实现“只保留最新帧”。
dropgbooleanfalse当队列满时是否丢弃旧 buffer。常用于实时流(如摄像头),防止延迟累积。
blocksizeguint4096每次拉取的字节数(仅在特定模式下有效,一般不用改)。
buffer-listgbooleanfalse是否使用 GstBufferList(批量 buffer),一般保持默认。

3. 同步与时序控制(Sync & QoS)

属性类型默认值说明
syncgbooleantrue是否根据 buffer 的 timestamp 进行时钟同步(即按播放时间等待)。
→ 非实时处理(如 AI)应设为 false 以提升吞吐
asyncgbooleantrue是否异步进入 PAUSED 状态(通常保持默认)。
max-latenessgint64-1(无限)buffer 超过 deadline 多少纳秒后被丢弃。设为 0 表示绝不容忍延迟。
processing-deadlineguint64

20,000,000ns

(20ms)

最大允许的 buffer 处理时间,超时可能触发 drop。
render-delayguint640额外渲染延迟(调试用)。
ts-offsetgint640对所有 buffer 时间戳增加偏移(单位:ns)。
throttle-timeguint640强制在 buffer 之间插入最小间隔(单位:ns),用于限速。
qosgbooleanfalse是否向上游发送 QoS 事件,通知其调整速率(适用于自适应流)。

4. 性能与统计

属性类型说明
statsGstStructure*只读。包含:
• rendered: 成功处理的 buffer 数
• dropped: 因延迟/队列满被丢弃的 buffer 数
• average-rate: 平均处理速率(buffers/sec)
max-bitrateguint64最大比特率限制(0 = 无限制),单位 bps。

5. 生命周期控制

属性类型默认值说明
wait-on-eosgbooleantrue收到 EOS 后是否等待所有 buffer 处理完毕再结束。

🔔 五、Element Signals(信号)

emit-signals=true 时,以下信号会被触发:

信号回调签名触发时机用途
new-sampleGstFlowReturn (callback)(GstAppSink*, gpointer)每当一个新 sample 到达最常用! 在回调中调用 pull-sample 获取数据
new-preroll同上preroll 阶段(如 PAUSED 状态第一帧)初始化或预览
eosvoid (callback)(GstAppSink*, gpointer)收到 EOS通知应用流已结束

✅ 使用流程:

g_object_set(appsink, "emit-signals", TRUE, NULL);
g_signal_connect(appsink, "new-sample", G_CALLBACK(on_new_sample), user_data);

🛠️ 六、Element Actions(主动拉取方法)

即使不使用信号,也可主动拉取数据(通过 GObject action signals):

动作参数返回值说明
pull-sampleGstSample*阻塞式拉取下一个 sample(无数据时等待)
try-pull-sampletimeout (ns)GstSample*非阻塞式拉取,超时返回 NULL
pull-prerollGstSample*拉取 preroll sample(启动时第一帧)
try-pull-prerolltimeout (ns)GstSample*非阻塞版 preroll 拉取

💡 在 Python 中通常直接调用:

sample = appsink.emit("pull-sample")

🎯 七、典型使用模式对比

模式适用场景关键设置
事件驱动(推荐)实时流、响应式处理emit-signals=true + 连接 new-sample
轮询拉取批处理、简单脚本直接调用 pull-sample()
仅取最新帧摄像头预览、AI推理max-buffers=1drop=truesync=false

✅ 八、最佳实践建议

  1. 务必设置 caps:明确指定输出格式(如 video/x-raw, format=BGR
  2. 实时流drop=truemax-buffers=1sync=false
  3. 非实时处理(如 AI):关闭 sync 和 qos,提升吞吐
  4. 内存管理GstSample 和 GstBuffer 使用后需 unref
  5. 错误处理:检查 pull-sample 返回值是否为 NULL

📚 九、参考命令

gst-inspect-1.0 appsink

查看本地安装的 appsink 详细信息。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐