如何将GStreamer消息记录到文件中

时间:2013-10-21 10:07:58

标签: python c gstreamer glib

我有一个视频处理守护程序(python),它运行几个进程,其中一些使用GStreamer将原始视频帧提供给我的自定义元素(C)。一些进程“冻结”(进程is_alive() = True,但Gstreamer管道不执行任何操作并且不调用任何python回调) - 通常在2-10天之后,并且仅在生产中。我无法在计算机上复制此内容。

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

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

我在回调中有一些python日志记录和C插件中的很多glib日志记录,但显然还不够。 python程序和C元素之间的某些东西可能会失败。所以我真的需要看看GStreamer的内容是怎么回事。

不幸的是,在我看来,除了拦截stderr之外,没有办法调试Gstreamer。

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

总结一下:

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

正如评论中所建议的那样,我可以使用GST_DEBUG_FILE env.variable,但这可以从GStreamer 0.10.31开始。我有0.10.30所以我不能用它。
或者我可以编写自定义日志处理程序,但由于它必须用python编写而且`gst_debug_log_default'不能从python绑定中访问,这也不起作用(也许我错了)。

1 个答案:

答案 0 :(得分:2)

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