我正在使用gstreamer通过网络传输音频。我的目标看似简单:将输入流预缓冲到某个时间/字节阈值,然后开始播放。 我可能会忽略gstreamer的一个非常简单的功能,但到目前为止,我还没有找到办法做到这一点。
我的(简化)管道如下所示:udpsrc -> alsasink
。到目前为止,我实现目标的所有尝试都是在两者之间使用队列元素:
min-threshold-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,但欢迎使用任何语言的任何解决方案。
感谢。
答案 0 :(得分:3)
缓存已经在GStreamer中实现。某些元素(如队列)能够构建此缓冲区并发布有关缓冲区级别(队列状态)的总线消息。
如果缓冲级别不够高(通常,只要低于100%),那么想要拥有更多网络弹性的应用程序应该监听这些消息并暂停播放。
因此,您需要做的就是在队列缓冲时将管道设置为 PAUSED 状态。在你的情况下,你只想缓冲一次,所以使用任何逻辑(也许设置标志变量只是第一次暂停管道)。
最后,有关完整的流媒体示例,您可以参考本教程:https://gstreamer.freedesktop.org/documentation/tutorials/basic/streaming.html 代码在C中,但演练应该可以帮助您。
答案 1 :(得分:0)
我遇到了与使用不同管道(appsrc)完全相同的问题,并且在花了几天时间试图找到一个优雅的解决方案(并最终得到与您发布的代码非常相似的代码)...我所做的只是将标志is-live
切换为False
,缓冲自动完成。 (不需要min-threshold-time
或其他任何东西)
希望这有帮助。