使用 GstDiscoverer (GStreamer) 的分段错误

Segmentation fault using GstDiscoverer (GStreamer)

我正在为 windows 在 C++ 上使用 Qt 进行 GUI 和 GStreamer 进行音频处理编写桌面应用程序。

在我的应用程序中,我需要监控多个互联网 aac 音频流(如果它们在线),并收听具有最高优先级的可用流。对于此任务,我使用 GStreamer 中的 GstDiscoverer 对象,但我遇到了一些问题。

我每 1-2 秒检查一次音频流,因此经常调用 GstDiscoverer。 每次我的应用程序都是 运行,最终它会在 GstDiscoverer 检查期间因分段错误而崩溃。

我尝试了调用 GstDiscoverer 的同步和异步方法(gst_discoverer_discover_uri(),gst_discoverer_discover_uri_async()),两者的工作方式相同。

崩溃发生在第 1122 行 gsttypefindfunctions.c 的 aac_type_find() 函数中(下面的第二行代码)。

len = ((c.data[offset + 3] & 0x03) << 11) |
       (c.data[offset + 4] << 3) | ((c.data[offset + 5] & 0xe0) >> 5);

在其中一次崩溃期间从调试器接收到的局部变量:

正如我们所见,偏移变量大于c.size,所以c.data[偏移]超出范围,我认为这就是发生分段错误的原因。 这种情况不经常发生。该程序可以工作几个小时或十分钟。 但在我看来,如果 GstDiscoverer 调用之间的时间间隔很小,它会更频繁地发生。因此,调用 aac_type_find().

有一定的崩溃概率

我尝试了 GStreamer 1.6.1 和最新的 1.6.2 版本,两者都存在错误。

有人可以帮我解决这个问题吗?这是 Gstreamer 错误还是我做错了什么?

已向此处的 GStreamer 项目报告并合并了一个崩溃补丁并将在下一个版本中:https://bugzilla.gnome.org/show_bug.cgi?id=759910