2

我有一个视频处理守护进程 (python),它运行多个进程,其中一些使用 GStreamer 将原始视频帧获取到我的自定义元素 (C)。一些进程“冻结”(进程is_alive() = True,但 Gstreamer 管道不做任何事情,也不调用任何 python 回调) - 通常在 2-10 天后,并且仅在生产中。我无法在我的计算机上复制它。

现在我有来自 python 日志(主程序)和 glib 日志(C 插件)的日志文件,但没有任何帮助,即使我在各处添加了更多的日志消息。所以我希望 GStreamer 的消息中会有一些线索。

我在专用于视频处理的进程中运行 glib“主循环”,然后将带有结果的消息发送multiprocessing.Queue到另一个进程,以供进一步处理。这些 gst/video-processes 对 python 有点陌生——有很多来自 gstreamer 和其他 gstreamer 怪异的回调。这就是为什么我将它们隔离在不同的进程中。

我在回调中有一些 python 日志记录,在 C 插件中有很多 glib 日志记录,但这显然还不够。python 程序和 C 元素之间可能会失败。所以我真的需要看看 GStreamer 的内部到底发生了什么。

不幸的是,在我看来,除了拦截stderr.

我尝试在没有守护进程的情况下运行该程序,设置GST_DEBUG并存储stderr到一个 gzip 压缩文件中,但这并没有太大帮助,因为我将所有 GStreamer 消息混合在一个巨大的文件中。

总结一下:

  • 我有一个守护进程(因此没有标准错误,没有标准输出)
  • 在守护进程中,我有很多子进程
  • 其中一些(实际上是 14 个)运行 GStreamer 管道
  • 我有一些神秘的失败
  • 我非常需要 GStreamer 调试输出
  • 但我需要将每个进程的 GStreamer 消息写入不同的文件,这样我就不会迷失在其中
  • 我不知道该怎么做。

正如评论中所建议的,我可以使用GST_DEBUG_FILEenv.variable,但这适用于 GStreamer 0.10.31。我有 0.10.30 所以我不能使用它。
或者我可以编写自定义日志处理程序,但由于它必须用 python 编写,并且 python 绑定无法访问“gst_debug_log_default”,所以这也不起作用(也许我错了)。

4

1 回答 1

2

您将编写自己的日志处理程序。这是一个类似的问题及其答案。请看看这是否有帮助。

于 2013-10-21T10:45:22.943 回答