【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 ...
随机推荐
- override关键字
https://www.cnblogs.com/xinxue/p/5471708.html 2 重写 (override) 在 1.2.2 中提到 override 关键字,可以避免派生类中忘记重写 ...
- #505. 「LibreOJ β Round」ZQC 的游戏
题目描述 首先一定是让ZQC吃掉他能吃到的所有的球,这样才能尽可能的满足ZQC的质量是所有玩家中最大的. 在满足某一个玩家的质量不会超过ZQC的情况下,让这个玩家吃掉尽可能多的球,让其他玩家吃掉的尽可 ...
- Mysql插入多条数据测试
--新建存储过程 create procedure doinsert3() begin declare i int; declare j int; set i = 0; set j = 0; whil ...
- 开源GIT仓库-----gitlab
简介:GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码 ...
- 2018-2019-2 20165212《网络对抗技术》Exp9 Web安全基础
2018-2019-2 20165212<网络对抗技术>Exp9 Web安全基础 基础问题回答 1.SQL注入攻击原理,如何防御? 原理:SQL注入,就是通过把SQL命令插入到Web表单递 ...
- Perl字符贪吃蛇
一时兴起,想试试能不能用perl实现字符贪吃蛇,算法如下: 定义2个数组@bg.@snake,@bg用来显示整个界面,@snake从蛇头开始保存蛇的坐标点. 蛇每移动一次,新的坐标点放到@snake头 ...
- vue子组件数据变化同步到父组件中
方法:通过watch监听子组件数据变化 1.父组件中注册方法 <Child @getChildValue="getChildValue"></Child> ...
- System.Net.WebRequestMethods.cs
ylbtech-System.Net.WebRequestMethods.cs 1.返回顶部 1. #region 程序集 System, Version=4.0.0.0, Culture=neutr ...
- Remix 搭建与简单使用,并支持外部访问
Remix 搭建与简单使用,并支持外部访问 转 https://blog.csdn.net/linshenyuan1213/article/details/83444911 remix是基于浏览器的在 ...
- Kotlin集合——Set集合
Kotlin集合——Set集合 转 https://www.jianshu.com/p/3c95d7729d69 Kotlin的集合类由两个接口派生:Collection和Map. Kotlin的 ...