目标

有时我们的应用并没有按照我们的预期来工作,并且在总线上获得的错误信息也没有足够的内容。这时我们该怎么办呢?幸运的时,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. 自定义mvc增删改查

    对t_mvc_book表的增删改查 导入jar包 BaseDao package com.hmc.util; import java.lang.reflect.Field; import java.s ...

  2. snmp-trap

    snmpd作为一个服务,本身有系统的一些信息,外部可以通过snmp -get ,walk来获取,前提是被控主机开启了snmpd服务, snmptrap理解为一个陷阱,等着掉进来猎物,就是一个收数据的服 ...

  3. 洛谷 P1231教辅的组成

    题目描述 /* s->练习册(1~b)->书(b+1~a+b)->答案(a+b+1~a+b+c)->t 但是可能会有多本练习册指向同一本书,这本书又可能会指向多本答案 这样每本 ...

  4. 1054 The Dominant Color (20)(20 分)

    Behind the scenes in the computer's memory, color is always talked about as a series of 24 bits of i ...

  5. Pytest权威教程18-插件编写

    [TOC] 返回: Pytest权威教程 插件编写 很容易为你自己的项目实现[本地conftest插件或可以在许多项目中使用的可[安装的插件,包括第三方项目.如果你只想使用但不能编写插件,请参阅[安装 ...

  6. [洛谷 P4556] 雨天的尾巴

    传送门 Solution 线段树合并的入门题 lca可以在dfs的时候离线求(用并查集) 更新的点有每条链的两个端点,它们的lca和dad[lca] 为了节省空间,lca和dad[lca]的更新可以先 ...

  7. SpringBoot获取Freemarker模板引擎,生成HTML代码

    今天用Ajax异步添加评论,加载Freemarker模板引擎,生成模板模块 1.新建Freemarker模板 <li id="${comment.oId}"> < ...

  8. Java SpringBoot注解方式开启异步支持

    package task.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import ...

  9. Git的使用(3) —— 远程版本库的操作(GitHub)

    1. 配置SSH (1) GitHub 登陆GitHub后,点击右上角头像,选择 Setting . 在左面栏目中选择"SSH and GPG keys". 打开生成的SSH公钥文 ...

  10. scala_基础

     笔记前言:本笔记为scala的入门基础和scala基础使用.主要参考为书籍和推荐较高的博客.主要目的为供个人总结学习. 所有来自网络参考内容不一一列出. 一.面向过程 1.变量体 val 标识符:声 ...