【GStreamer开发】GStreamer基础教程11——调试工具
目标
有时我们的应用并没有按照我们的预期来工作,并且在总线上获得的错误信息也没有足够的内容。这时我们该怎么办呢?幸运的时,GStreamer自身提供了大量的调试信息,通常这些信息会给出一些线索,指向出错的地方。本教程主要讲述:
如何在GStreamer里面获得更多地调试信息
如何把你自己的调试信息加入GStreamer的调试记录
如何获得图形化的pipeline
打印调试信息
调试记录
GStreamer和插件里面都有大量的调试信息,也就是说,在调试区域内可以给出所有的信息,包括时间戳,线程,种类,源文件名,函数名等等等等
调试输出的控制实在一个GST_DEBUG的环境变量控制的,这里给出一个例子,GST_DEBUG=2:
- :00:00.868050000 1592 09F62420 WARN filesrc gstfilesrc.c:1044:gst_file_src_start:<filesrc0> error: No such file "non-existing-file.webm"
正如你所看到的,这些信息有点过于多了。事实上,GStreamer的调试日志实在太冗余了,如果统统打开的话,很快就会让这个日志文件变成以M为单位的文件。这会让应用的运行速度降下来,所以,记录会被分类,你很少需要打开所有的种类。
第一个分类是调试等级,这个可以指定输出内容的等级:
为了允许调试内容输出,把GST_DEBUG的环境变量设置到需要的层级。所有该层级以下的信息都会显示。(比如,设GST_DEBUG=2,那么可以看到ERROR和WARNING信息)。
而且,每一个插件或者部分的GStreamer可以定义自己的种类,所以你可以对每个不同的种类指定各自的层级。例如,GST_DEBUG=2,audiotestsrc:5,会对audiotestsrc使用第5级调试等级,其余的使用第2级。
这样GST_DEBUG变量就是一个由逗号来分割的一系列“种类:层级”对了,除了在开始时给出一个默认等级值。
'*'通配符也是可以使用的。例如,GST_DEBUG=2,audio*:5就是说明除了所有audio开头的种类用第5级之外,其余的都是用第2级。
使用gst-launch-0.10 --gst-debug-help来获得所有注册的种类。记住每个插件都注册自己的种类,所以,当安装或者删除一个插件时,这个列表会变化。
当GStreamer总线上传上来的错误信息已经不够让你定位分析问题的时候,使用GST_DEBUG这个变量。常见的做法是把输出重定向到一个调试日志里面去,这样可以晚一点来查看。
调试输出的每一行的内容应该是:
- :00:00.868050000 1592 09F62420 WARN filesrc gstfilesrc.c:1044:gst_file_src_start:<filesrc0> error: No such file "non-existing-file.webm"
| 0:00:00.868050000 | 时间戳,HH:MM:SS:sssssssss,记录自从应用开始之后的时间 |
| 进程ID | |
| 09F62420 | 线程ID |
| WARN | 调试信息等级 |
| filesrc | 调试信息种类 |
| gstfilesrc.c:10444 | 文件名,行号 |
| gst_file_src_start | 函数名 |
| <filesrc0> | 发出消息的对象名 |
| error:No such file "non-existing-file.webm" | 错误消息内容 |
加入你自己的调试信息
在你和GStreamer交互的那部分代码里面,使用GStreamer调试工具是很有意思的。在这种方法下,你会在同一个文件得到所有调试输出并且当时不同消息之间的联系也会保留下来。
为了做到这一点,请使用GST_ERROR(),GST_WARNING(),GST_INFO(),GST_LOG()和GST_DEBUG()宏。它们就像printf一样可以接受一些参数并且它们是使用默认种类的。
为了切换到某个更加有意义的种类,在你的代码之前增加这样两行:
- GST_DEBUG_CATEGORY_STATIC (my_category);
- #define GST_CAT_DEFAULT my_category
然后再用gst_init()初始化GStreamer之后加上:
- , "This is my very own");
这会注册一个新的种类(这是在你的应用中,并不在任何文件里面),并把该种类设置成默认的。具体请查阅文档的GST_DEBUG_CATEGORY_INIT()内容。
获得pipeline图像
在那些pipeline变得很庞大连接关系已经看不清的例子中,GStreamer可以输出描述pipeline拓扑结构以及每个连接的Caps的协商的图像,这个文件是.dot文件,用GraphViz之类的免费软件就可以看了。
在复合element情况下,比如playbin2或者uridecodebin之类,这方法也很方便。.dot文件也可以把这些元素内部的情形绘制出来。
为了得到.dat文件,需要把GST_DEBUG_DUMP_DOT_DIR环境变量设置成你需要输出内容的文件夹。gst-launch会在每次状态变化时创建一个.dot文件,这样你可以看见Caps协商的演变。清楚这个环境变量就可以关闭这项功能。在你的应用里面,你可以使用GST_DEBUG_BIN_TO_DOT_FILE()和GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()宏来在你方便的时候获得.dot文件。
这里你有一个用playbin2创建的pipeline的例子。因为playbin2可以处理各种各样的情形,所以它的内部十分复杂。你的手动创建的pipeline一般不会这么复杂。下面是playbin2的拓扑图:
【GStreamer开发】GStreamer基础教程11——调试工具的更多相关文章
- Android程序开发0基础教程(一)
程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操 ...
- GStreamer基础教程11 - 与QT集成
摘要 通常我们的播放引擎需要和GUI进行集成,在使用GStreamer时,GStreamre会负责媒体的播放及控制,GUI会负责处理用户的交互操作以及创建显示的窗口.本例中我们将结合QT介绍如何指定G ...
- cocos基础教程(11)事件分发机制
cocos3.0的事件分发机制: 创建一个事件监听器-用来实现各种触发后的逻辑. 事件监听器添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理. 事件监听器有以下几种 ...
- iOS开发零基础教程之生成git所需的SSH keys
在我们github看到了一个不错的第三方库时,可能我们想把他git clone到本地,我们需要复制他的SSH URL,如下图: 复制完地址之后,我们需要打开终端,然后输入命令: git clone + ...
- Java基础教程(11)--对象
一.创建对象 下面的语句创建了一个对象并把它的引用赋值给了一个变量: Point originOne = new Point(23, 94); 这条语句由三部分组成(下面将详细讨论): 声明对 ...
- 计算机基础教程11 - 互联网&内联网
在本章中,我们将看到什么是Internet和Intranet,以及讨论两者之间的异同. 互联网 它是互联计算机网络的全球/全球系统.它使用标准的Internet协议(TCP / IP).Interne ...
- Ruby 基础教程 1-1
1.指定编码方式 第一种 在代码文件首行通过 #encoding:GBK的方式 第二种 ruby -E UTF-8 文件名称 第三种 irb -E UTF-8 2 ...
- Chrome扩展开发基础教程(附HelloWorld)
1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...
- 【GStreamer开发】GStreamer基础教程10——GStreamer工具
目标 GStreamer提供了一系列方便使用的工具.这篇教程里不牵涉任何代码,但还是会讲一些有用的内容: 如何在命令行下建立一个pipeline--完全不使用C 如何找出一个element的Capab ...
随机推荐
- Codevs 1482 路线统计(矩阵乘法)
1482 路线统计 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description N个节点的有向图, 求从start到finish刚好经过时 ...
- UOJ188. 【UR #13】Sanrd [min_25筛]
传送门 思路 也可以算是一个板题了吧qwq 考虑min_25筛最后递归(也就是DP)的过程,要枚举当前最小的质因子是多少. 那么可以分类讨论,考虑现在这个质因子是否就是次大质因子. 如果不是,那么就是 ...
- Python3文件
open()方法 Python open()方法永于打开一个文件,并返回文件对象,并对文件进行处理过程中都需要用到这个方法,如果该文件无法被打开,则抛出OSError 注意:使用open()方法一定要 ...
- P2502 [HAOI2006]旅行——暴力和并查集的完美结合
P2502 [HAOI2006]旅行 一定要看清题目数据范围再决定用什么算法,我只看着是一个蓝题就想到了记录最短路径+最小生成树,但是我被绕进去了: 看到只有5000的边,我们完全可以枚举最小边和最大 ...
- [MYSQL手工注入](3)基于报错的SQL注入实战
0x03 MYSQL 手工注入实战--基于错误的 SQL 注入 今天如愿以偿的找到了基于错误的SQL注入环境了:是一个国外卖音响的小网站,还在建设中: 看一下报错信息: (1)确定闭合语句:从上面的报 ...
- 编译安装-httpd-2.2.15.tar.gz
编译安装(又称源代码安装) 找到httpd-2.2.15.tar.gz安装包并拖到桌面root文件夹里 解包阶段 tar zxf httpd-2.2.15.tar.gz -C /usr/src 配置阶 ...
- simplec与simple【转载】
转载自:http://blog.163.com/wu_yangfeng/blog/static/161897379201041581144971/ 在FLUENT中,可以使用标准SIMPLE算法和SI ...
- python 的小技巧之统计list里面元素的个数
一般写法 def count_list(std:list,tongji): i=0 for item in std: if item==tongji: i+=1 print(i) if __name_ ...
- PC 端常用软件
WPS 金山文档 有道云笔记 格式工厂 运行精灵 UC 遨游 360 Firefox 浏览器 光影魔术手 美图秀秀 2345好压 火绒安全软件 有道云笔记 悟空游戏厅 微信 QQ 迅雷 百度网盘 ...
- ORACLE AUDIT
Oracle 作者:Davis_itpub 时间:2018-06-27 16:28:39 61 0 审计(Audit)用于监视用户所执行的数据库操作,并且Oracle 会将审计跟踪结果存放到OS ...
