我正在使用 gstreamer 通过网络传输音频。我的目标看似简单:将传入流预缓冲到某个时间/字节阈值,然后开始播放。我可能忽略了 gstreamer 的一个非常简单的功能,但到目前为止,我还没有找到一种方法来做到这一点。
我的(简化的)管道如下所示udpsrc -> alsasink
:到目前为止,我为实现目标所做的所有尝试都是在两者之间使用队列元素:
- 在两者之间添加一个队列元素。
- 使用该
min-threshold-time
物业。这实际上可行,但问题是,它使所有传入数据在队列中花费指定的最短时间,而不仅仅是开始,这不是我想要的。 - 为了解决前面的问题,我尝试让队列在数据第一次进入音频接收器时通知我的代码,认为这是取消我之前设置的 min-time 属性的时间,从而实现“预缓冲”行为。
这是我尝试过的代码的大致等价物:
def remove_thresh(pad, info, queue):
pad.remove_data_probe(probe_id)
queue.set_property("min-threshold-time", 0)
queue.set_property("min-threshold-time", delay)
queue.set_property("max-size-time", delay * 2)
probe_id = audiosink.get_pad("sink").add_data_probe(remove_thresh, queue)
这不起作用有两个原因:
- 我的回调比
delay
我提供的变量更早地被调用。 - 调用它后,存储在队列中的所有数据都将丢失。播放开始时就好像队列根本不存在一样。
我认为我对这件事的工作原理有一个根本的误解。有谁知道我做错了什么,或者可以提供(可能)更好的方法来做到这一点?我在这里使用 python,但欢迎使用任何语言的任何解决方案。
谢谢。