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
相关产品推荐
相关产品推荐

