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

如何为GStreamer的filesrc元素设置0.25秒的分段长度?

问题

我希望将GStreamer管道中filesrc元素输出的分段长度限制为0.25秒。目前根据按键操作后修改管道元素到看到结果的延迟,推测当前分段长度约为3秒。

我了解到GstBaseSrc拥有可实现该需求的segment属性,且FileSrc继承了该属性,但始终无法成功设置该属性。

我尝试通过以下代码获取、修改并设置分段时长属性:

data.source  = gst_element_factory_make ("filesrc", "source");

GstSegment segment = {0, 0, 0, 0, 0, 0, 0, 0};
// get segment from file src
g_object_get (G_OBJECT (data.source), "segment", &segment, NULL);

segment.duration = .25*GST_SECOND;

g_object_set (G_OBJECT (data.source), "segment", &segment, NULL);

// gst_base_src_set_format(GST_BASE_SRC(data.source), GST_FORMAT_TIME);

// add elements to pipeline
gst_bin_add_many (GST_BIN (data.pipeline), data.source, data.demuxer, data.decoder, data.videorate, data.encoder, data.muxer, data.sink, NULL);

运行代码时,我得到错误提示:

g_object_set_is_valid_property: object class 'GstFileSrc' has no property named 'segment'

请问是否有我遗漏的设置方法?

解决方案

首先纠正你的核心错误:segment并不是GstFileSrc暴露的GObject属性,你不能通过g_object_get/set直接操作它。GstSegment是GStreamer内部用于跟踪媒体分段播放、读取状态的结构体,由GstBaseSrc自行维护,仅在seek等操作时会被内部更新,不支持外部直接设置。

要实现将filesrc的输出分段限制为0.25秒、降低操作延迟,你可以用以下两种方法:

1. 设置filesrc的blocksize属性

blocksize是GstBaseSrc的有效属性,用于控制每次读取并推送的字节数。你可以根据媒体的码率计算出0.25秒对应的数据量,设置为blocksize的值:

data.source = gst_element_factory_make("filesrc", "source");
// 示例:假设媒体码率为10Mbps,计算0.25秒对应的字节数
guint blocksize = (10 * 1024 * 1024 / 8) * 0.25; // 327680字节
g_object_set(G_OBJECT(data.source), "blocksize", blocksize, NULL);

如果不知道媒体码率,可以先设置一个较小的固定值(比如4096),再结合后续的缓存限制优化。

2. 用queue元素限制缓存时长

在管道中插入queue元素,通过max-size-time属性强制限制缓存的媒体时长,从整体上降低延迟:

// 创建低延迟queue
GstElement *low_latency_queue = gst_element_factory_make("queue", "low-latency-queue");
// 设置缓存最大时长为0.25秒
g_object_set(G_OBJECT(low_latency_queue), "max-size-time", 0.25 * GST_SECOND, NULL);

// 将queue加入管道并调整链接顺序
gst_bin_add_many(GST_BIN(data.pipeline), data.source, low_latency_queue, data.demuxer, data.decoder, data.videorate, data.encoder, data.muxer, data.sink, NULL);
gst_element_link_many(data.source, low_latency_queue, data.demuxer, NULL);
// 完成其他元素的链接逻辑

额外优化:设置管道延迟

为了进一步强化低延迟特性,还可以设置整个管道的latency属性:

gst_pipeline_set_latency(GST_PIPELINE(data.pipeline), 250 * GST_MSECOND);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:27:29