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

GStreamer 1.22中如何获取srtsrc完整统计信息?

获取GStreamer 1.22中srtsrc完整统计信息的解决方法

问题原因

你当前只拿到空的统计数据,大概率是因为srtsrc默认未启用定期统计更新,或者获取时机不对,导致stats结构未被填充完整字段。

解决步骤

1. 启用统计自动更新

srtsrc有个stats-report-interval属性,默认值为0(即不自动更新统计)。需要将其设置为大于0的毫秒值,让插件定期更新统计数据:

// 在创建srtsrc元素后、启动管线前设置
g_object_set(source, "stats-report-interval", 1000, NULL); // 每1秒更新一次统计

2. 正确时机获取统计

必须等管线进入PLAYING状态,且SRT连接建立、有实际数据流传输后,再去获取统计信息。不要在管线刚初始化或PAUSED状态下调用,此时统计还未生成。

3. 完整提取统计字段

不要仅依赖gst_structure_to_string输出(可能遗漏部分字段),建议逐个提取需要的统计项,示例代码:

// 确保管线已处于PLAYING状态且有数据流
GstStructure *stats = nullptr;
g_object_get(source, "stats", &stats, NULL);

if (stats) {
    guint64 total_bytes;
    gdouble rtt_ms;
    gdouble recv_bandwidth;

    // 提取已接收总字节数
    if (gst_structure_get_uint64(stats, "bytes-received-total", &total_bytes)) {
        std::cout << "已接收总字节数: " << total_bytes << std::endl;
    }
    // 提取RTT值(毫秒)
    if (gst_structure_get_double(stats, "rtt", &rtt_ms)) {
        std::cout << "RTT: " << rtt_ms << " ms" << std::endl;
    }
    // 提取接收带宽(bps)
    if (gst_structure_get_double(stats, "bandwidth-received", &recv_bandwidth)) {
        std::cout << "接收带宽: " << recv_bandwidth << " bps" << std::endl;
    }
    // 其他可选字段:bytes-sent-total、bandwidth-sent、packet-loss-rate等

    gst_structure_free(stats);
} else {
    std::cout << "统计信息不可用" << std::endl;
}

4. 备选方案:直接调用SRT原生API

如果通过GStreamer的stats属性仍无法获取完整字段,可以直接通过srtsrc的SRT套接字调用原生API获取全量统计:

#include <srt/srt.h>

// 获取srtsrc内部的SRT套接字
SRTSOCKET srt_sock;
g_object_get(source, "socket", &srt_sock, NULL);

if (srt_sock != SRT_INVALID_SOCK) {
    SRTSocketStat srt_stat;
    int ret = srts_getstat(srt_sock, &srt_stat, sizeof(srt_stat));
    if (ret == 0) {
        std::cout << "RTT: " << srt_stat.msRTT << " ms" << std::endl;
        std::cout << "已接收总字节数: " << srt_stat.bytesRecvTotal << std::endl;
        std::cout << "接收带宽: " << srt_stat.bandwidthRecv << " bps" << std::endl;
        std::cout << "丢包率: " << srt_stat.pktLossRate << std::endl;
        // 更多字段可参考SRT头文件中SRTSocketStat结构体定义
    } else {
        std::cout << "获取SRT统计失败: " << srt_getlasterror_str() << std::endl;
    }
}

注意事项

  • 确保你的GStreamer 1.22版本已正确编译并启用SRT插件;
  • 确认推流端与接收端的SRT连接已正常建立,有实际数据流传输;
  • 避免过于频繁地获取统计数据,防止影响性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:42:47