前言
本文是GStreamer学习笔记,也可以看成是对原文的意译。
这些教程描述了理解其余教程所需的GStreamer主题。
GStreamer教程:
环境
系统环境
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic
Linux version : 5.3.0-46-generic ( buildd@lcy01-amd64-013 )
Gcc version: 7.5.0 ( Ubuntu 7.5.0-3ubuntu1~18.04 )
软件信息
version :
GStreamer-1.0
正文
1. 目标
有时事情不会按预期进行,从总线检索到的错误消息(如果有的话)只是没有提供足够的信息。幸运的是,GStreamer 附带了大量的调试信息,这些信息通常会提示问题可能是什么。本教程显示:
- 如何从 GStreamer 获取更多调试信息。
- 如何将您自己的调试信息打印到 GStreamer 日志中。
- 如何获取管道图
2. 打印调试信息
2.1 调试日志
GStreamer 及其插件充满了调试跟踪,即在代码中将一条特别有趣的信息打印到控制台的位置,以及时间戳、进程、类别、源代码文件、函数和元素信息。
调试输出由GST_DEBUG
环境变量控制。这是一个例子GST_DEBUG=2
:
0:00:00.868050000 1592 09F62420 WARN filesrc gstfilesrc.c:1044:gst_file_src_start:<filesrc0> error: No such file "non-existing-file.webm"
如您所见,这是相当多的信息。事实上,GStreamer 调试日志非常冗长,当完全启用它时,它会导致应用程序无响应(由于控制台滚动)或填满数兆字节的文本文件(当重定向到文件时)。因此,日志是分类的,您很少需要一次启用所有类别。
第一类是调试级别,它是一个指定所需输出量的数字:
| # | Name | Description |
| --- | ------- | --------------------------------------------------------------- |
| 0 | none | No debug information is output. |
| 1 | ERROR | Logs all fatal errors. These are errors that do not allow the |
| | | core or elements to perform the requested action. The |
| | | application can still recover if programmed to handle the |
| | | conditions that triggered the error. |
| 2 | WARNING | Logs all warnings. Typically these are non-fatal, but |
| | | user-visible problems are expected to happen. |
| 3 | FIXME | Logs all "fixme" messages. Those typically that a codepath that |
| | | is known to be incomplete has been triggered. It may work in |
| | | most cases, but may cause problems in specific instances. |
| 4 | INFO | Logs all informational messages. These are typically used for |
| | | events in the system that only happen once, or are important |
| | | and rare enough to be logged at this level. |
| 5 | DEBUG | Logs all debug messages. These are general debug messages for |
| | | events that happen only a limited number of times during an |
| | | object's lifetime; these include setup, teardown, change of |
| | | parameters, etc. |
| 6 | LOG | Logs all log messages. These are messages for events that |
| | | happen repeatedly during an object's lifetime; these include |
| | | streaming and steady-state conditions. This is used for log |
| | | messages that happen on every buffer in an element for example. |
| 7 | TRACE | Logs all trace messages. Those are message that happen very |
| | | very often. This is for example is each time the reference |
| | | count of a GstMiniObject, such as a GstBuffer or GstEvent, is |
| | | modified. |
| 9 | MEMDUMP | Logs all memory dump messages. This is the heaviest logging and |
| | | may include dumping the content of blocks of memory. |
+------------------------------------------------------------------------------+
要启用调试输出,请将GST_DEBUG
环境变量设置为所需的调试级别。也将显示低于该级别的所有级别(即,如果您设置GST_DEBUG=2
,您将同时获得ERROR
和 WARNING
消息)。
此外,每个插件或 GStreamer 的一部分都定义了自己的类别,因此您可以为每个单独的类别指定调试级别。例如GST_DEBUG=2,audiotestsrc:6
,, 将对元素使用调试级别 6,audiotestsrc
对所有其他元素使用 2。
因此,GST_DEBUG
环境变量是一个以逗号分隔的 category : level对列表,开头有一个可选级别,表示所有类别的默认调试级别。
'*'
通配符也可用。例如 GST_DEBUG=2,audio*:6
,将对所有以单词开头的类别使用 Debug Level 6 audio
。GST_DEBUG=*:2
相当于 GST_DEBUG=2
。
用于gst-launch-1.0 --gst-debug-help
获取所有已注册类别的列表。请记住,每个插件都会注册自己的类别,因此,在安装或删除插件时,此列表可能会更改。
GST_DEBUG
当 GStreamer 总线上发布的错误信息不能帮助您确定问题时使用。通常的做法是将输出日志重定向到一个文件,然后稍后检查它,搜索特定消息。
GStreamer 允许自定义调试信息处理程序,但使用默认处理程序时,调试输出中每一行的内容如下所示:
0:00:00.868050000 1592 09F62420 WARN filesrc gstfilesrc.c:1044:gst_file_src_start:<filesrc0> error: No such file "non-existing-file.webm"
这就是信息的格式:
| Example | Explained |
| ------------------ | ---------------------------------------------------------- |
| 0:00:00.868050000 | Time stamp in HH:MM:SS.sssssssss format since the start of |
| | the program. |
| 1592 | Process ID from which the message was issued. Useful when |
| | your problem involves multiple processes. |
| 09F62420 | Thread ID from which the message was issued. Useful when |
| | your problem involves multiple threads. |
| WARN | Debug level of the message. |
| filesrc | Debug Category of the message. |
| gstfilesrc.c:1044 | Source file and line in the GStreamer source code where |
| | this message was issued. |
| gst_file_src_start | Function that issued the message. |
| <filesrc0> | Name of the object that issued the message. It can be an |
| | element, a pad, or something else. Useful when you have |
| | multiple elements of the same kind and need to distinguish |
| | among them. Naming your elements with the name property |
| | makes this debug output more readable but GStreamer |
| | assigns each new element a unique name by default. |
| error: No such | |
| file .... | The actual message. |
+------------------------------------------------------------------------------+
2.2 添加自己的调试信息
在与 GStreamer 交互的代码部分中,使用 GStreamer 的调试工具很有趣。这样,您将所有调试输出都放在同一个文件中,并且保留了不同消息之间的时间关系。
为此,请使用、 GST_ERROR()
、GST_WARNING()
和宏。它们接受与 相同的参数 ,并使用类别(将在输出日志中显示为 Debug 类别)。GST_INFO()
GST_LOG()
GST_DEBUG()
printf
default
default
要将类别更改为更有意义的内容,请在代码顶部添加这两行:
GST_DEBUG_CATEGORY_STATIC (my_category);
#define GST_CAT_DEFAULT my_category
然后在您使用以下命令初始化 GStreamer 后进行此操作 gst_init()
:
GST_DEBUG_CATEGORY_INIT (my_category, "my category", 0, "This is my very own");
这会注册一个新类别(即,在您的应用程序期间:它不存储在任何文件中),并将其设置为您的代码的默认类别。请参阅GST_DEBUG_CATEGORY_INIT()
.
2.3 获取管道图
对于那些管道开始变得过大并且您无法跟踪与什么相关联的情况,GStreamer 具有输出图形文件的能力。这些是文件,可以使用GraphViz.dot
等免费程序读取,它们描述了管道的拓扑结构,以及每个链接中协商的上限。
这在使用诸如playbin
or之类的多合一元素时也非常方便uridecodebin
,它会在其中实例化多个元素。使用这些.dot
文件了解他们在内部创建的管道(并在此过程中学习一点 GStreamer)。
要获取.dot
文件,只需将GST_DEBUG_DUMP_DOT_DIR
环境变量设置为指向您希望放置文件的文件夹即可。gst-launch-1.0
将在每次状态更改时创建一个.dot
文件,因此您可以看到上限协商的演变。取消设置变量以禁用此功能。在您的应用程序中,您可以在方便时使用 GST_DEBUG_BIN_TO_DOT_FILE()
和 GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()
宏来生成.dot
文件。
这里有一个 playbin 生成的管道示例。它非常复杂,因为playbin
可以处理许多不同的情况:您的手动管道通常不需要这么长。如果您的手动管道开始变得非常大,请考虑使用playbin
.
3. 结论
- 如何使用GST_DEBUG环境变量从GStreamer获取更多调试信息
- 如何将自己的调试信息与GST_ERROR()宏变量一起打印到GStreamer日志中
- 如何使用GST_DEBUG_DUMP_DOT_DIR环境变量获取管道图