目标

有时我们的应用并没有按照我们的预期来工作,并且在总线上获得的错误信息也没有足够的内容。这时我们该怎么办呢?幸运的时,GStreamer自身提供了大量的调试信息,通常这些信息会给出一些线索,指向出错的地方。本教程主要讲述:

如何在GStreamer里面获得更多地调试信息

如何把你自己的调试信息加入GStreamer的调试记录

如何获得图形化的pipeline

打印调试信息

调试记录

GStreamer和插件里面都有大量的调试信息,也就是说,在调试区域内可以给出所有的信息,包括时间戳,线程,种类,源文件名,函数名等等等等

调试输出的控制实在一个GST_DEBUG的环境变量控制的,这里给出一个例子,GST_DEBUG=2:

[objc] view
plain
 copy

  1. :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这个变量。常见的做法是把输出重定向到一个调试日志里面去,这样可以晚一点来查看。

调试输出的每一行的内容应该是:

[objc] view
plain
 copy

  1. :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一样可以接受一些参数并且它们是使用默认种类的。

为了切换到某个更加有意义的种类,在你的代码之前增加这样两行:

[objc] view
plain
 copy

  1. GST_DEBUG_CATEGORY_STATIC (my_category);
  2. #define GST_CAT_DEFAULT my_category

然后再用gst_init()初始化GStreamer之后加上:

[objc] view
plain
 copy

  1. , "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——调试工具的更多相关文章

  1. Android程序开发0基础教程(一)

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一)   平台简单介绍   令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操 ...

  2. GStreamer基础教程11 - 与QT集成

    摘要 通常我们的播放引擎需要和GUI进行集成,在使用GStreamer时,GStreamre会负责媒体的播放及控制,GUI会负责处理用户的交互操作以及创建显示的窗口.本例中我们将结合QT介绍如何指定G ...

  3. cocos基础教程(11)事件分发机制

    cocos3.0的事件分发机制: 创建一个事件监听器-用来实现各种触发后的逻辑. 事件监听器添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理. 事件监听器有以下几种 ...

  4. iOS开发零基础教程之生成git所需的SSH keys

    在我们github看到了一个不错的第三方库时,可能我们想把他git clone到本地,我们需要复制他的SSH URL,如下图: 复制完地址之后,我们需要打开终端,然后输入命令: git clone + ...

  5. Java基础教程(11)--对象

    一.创建对象   下面的语句创建了一个对象并把它的引用赋值给了一个变量: Point originOne = new Point(23, 94);   这条语句由三部分组成(下面将详细讨论): 声明对 ...

  6. 计算机基础教程11 - 互联网&内联网

    在本章中,我们将看到什么是Internet和Intranet,以及讨论两者之间的异同. 互联网 它是互联计算机网络的全球/全球系统.它使用标准的Internet协议(TCP / IP).Interne ...

  7. Ruby 基础教程 1-1

    1.指定编码方式       第一种 在代码文件首行通过 #encoding:GBK的方式     第二种  ruby -E UTF-8 文件名称     第三种  irb  -E UTF-8   2 ...

  8. Chrome扩展开发基础教程(附HelloWorld)

    1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...

  9. 【GStreamer开发】GStreamer基础教程10——GStreamer工具

    目标 GStreamer提供了一系列方便使用的工具.这篇教程里不牵涉任何代码,但还是会讲一些有用的内容: 如何在命令行下建立一个pipeline--完全不使用C 如何找出一个element的Capab ...

随机推荐

  1. EL获取域中的数据

    EL(Expression Language)是表达式语言,EL的使用可以减少JAVA代码的书写. 1.EL表达式中的常量: <body bgcolor="#7fffd4"& ...

  2. 【概率论】6-3:中心极限定理(The Central Limit Theorem)

    title: [概率论]6-3:中心极限定理(The Central Limit Theorem) categories: - Mathematic - Probability keywords: - ...

  3. Loadrunner11录制过程中报错:由于另一个程序正在运行中,此操作无法完成

    第一次安装LR11录制没有问题,第二次录制也没有问题,后面第二天录制就出现了如下截图的现象  报错内容:由于另一个程序正在运行中,此操作无法完成.请选择“切换到”来激活正在运行中的的程序,并更正问题 ...

  4. vue + .net core 项目,源码在GitHub 希望对大家有所帮助

    一. github UI库 : iview 前端部分 vue .net core + DI + EF(dbfirst) 后端API 部分 .Net Core 二. 往期相关博客 SqlServer 获 ...

  5. Git的使用(6) —— 自动填写远端Git用户名密码

    1. 问题描述 公司项目组用私服的Git远程版本库,每一次推送和拉取服务都需要输入用户名和密码,过于繁琐. 2. 解决方法 Windows系统提供了"管理Windows凭据"的功能 ...

  6. pyinstaller在64位系统下打包32位程序

    使用环境说明:win10 64位,已安装python3.6-64位版本 遇到的问题:win10 64位打包成exe文件后,不能在32位系统运行 需求:使用python打包生成exe文件,win64位和 ...

  7. 范仁义web前端介绍课程---1、课程意义

    范仁义web前端介绍课程---1.课程意义 一.总结 一句话总结: 提供的这一整套学习方法和资源,配合艾宾浩斯遗忘曲线等各种复习.学习算法和后续会有的娱乐化学习方式,能否真正做到让学过的东西不再忘记. ...

  8. 手把手教你如何使用量产工具修复u盘

    u盘是我们平时都使用到的一个小工具,我们会使用它来进行储存一些重要的文件,但要是我们操作不当的话,那么就会导致u盘出现一些问题的哟,比如说插入u盘无法打开文件等等,那么遇到这个问题时该这么办呢?那么, ...

  9. numpy中的mean()函数

    本文链接:https://blog.csdn.net/lilong117194/article/details/78397329mean() 函数定义:numpy.mean(a, axis, dtyp ...

  10. script 命令/方法/函数

    $redis->script('load', $script); $redis->script('flush'); $redis->script('kill'); $redis-&g ...