使用 GstDiscoverer (GStreamer) 的分段错误

Posted

技术标签:

【中文标题】使用 GstDiscoverer (GStreamer) 的分段错误【英文标题】:Segmentation fault using GstDiscoverer (GStreamer) 【发布时间】:2015-12-27 09:42:31 【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

请将此情况报告给 GStreamer 开发人员,最好使用测试用例和示例文件。崩溃总是需要在您使用的软件中修复,并且您应该为此向开发人员报告。你可以在这里bugzilla.gnome.org/enter_bug.cgi?product=GStreamer @SebastianDröge:报告:bugzilla.gnome.org/show_bug.cgi?id=759910 【参考方案1】:

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

【讨论】:

以上是关于使用 GstDiscoverer (GStreamer) 的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

安装 Gstreamer 后没有这样的元素 filesrc

使用 OpenCV 2.4.8 的 gstreamer 管道程序引发运行时错误

Sailfish OS下的gstreamer没有输出声音

我如何获得 PyQt4.phonon?

centos 7 怎么安装mp3解码?以及怎么安装vlc?

测试使用