Gstreamer-LOG

本文详细介绍了GStreamer中的日志系统,包括日志级别的定义、控制日志输出的方法、自定义LOG模块的过程以及各种日志输出宏的使用。通过本文,读者可以全面了解如何在GStreamer中进行有效的日志管理和调试。

相关连接:https://blog.youkuaiyun.com/knowledgebao/article/details/84621238


目录

1. log调试信息的函数

1.1 最基本的log输出宏

1.2 不同的log输出宏分组

2,日志级别定义:

3,控制日志输出:

3.1. 使用命令行参数开启或设置debug信息

3.2. 使用环境变量开启或设置debug信息

3.3. 在代码中动态设置debug等级

4,定义自己的LOG模块:

4.1,element实现的.c文件开始位置增加如下代码:

4.2,element的*_class_init函数增加如下代码:


1. log调试信息的函数

1.1 最基本的log输出宏

 GST_CAT_LEVEL_LOG(cat,level,object,...)

其中

  • cat:表示category,用于区分log信息的类别,在后面说到debug level等信息的设置的时候会用到,可以是plugin名称或element名称或者是plugin或element的部分字符;
  • level:表示当前输出的这条log信息属于哪一个等级,具体的等级定义,将在后文中介绍;
  • obj:表示输出的log信息属于哪一个GObject(一般指element),注:此项可以设置为NULL,表示不属于任何GObject;
  • … : 为log信息的内容。

1.2 不同的log输出宏分组

为了使用的方便,根据不同的输出需求,在基础输出宏的基础上再做了一次封装,同样是使用宏定义的方式。

  • GST_CAT_ERROR_OBJECT(cat,obj,…)
  • GST_CAT_WARNING_OBJECT(cat,obj,…)
  • GST_CAT_INFO_OBJECT(cat,obj,…)
  • GST_CAT_DEBUG_OBJECT(cat,obj,…)
  • GST_CAT_LOG_OBJECT(cat,obj,…)
  • GST_CAT_FIXME_OBJECT(cat,obj,…)
  • GST_CAT_TRACE_OBJECT(cat,obj,…)

这一组主要使用到了category和GObject

  • GST_CAT_ERROR(cat,…)
  • GST_CAT_WARNING(cat,…)
  • GST_CAT_INFO(cat,…)
  • GST_CAT_DEBUG(cat,…)
  • GST_CAT_LOG(cat,…)
  • GST_CAT_FIXME(cat,…)
  • GST_CAT_TRACE(cat,…)

这一组只使用到了category,而obj项将被设置为NULL

  • GST_ERROR_OBJECT(obj,…)
  • GST_WARNING_OBJECT(obj,…)
  • GST_INFO_OBJECT(obj,…)
  • GST_DEBUG_OBJECT(obj,…)
  • GST_LOG_OBJECT(obj,…)
  • GST_FIXME_OBJECT(obj,…)
  • GST_TRACE_OBJECT(obj,…)

这一组只使用到了 obj, 而category项将被设置为GST_CAT_DEFAULT,即默认类别

  • GST_ERROR(…)
  • GST_WARNING(…)
  • GST_INFO(…)
  • GST_DEBUG(…)
  • GST_LOG(…)
  • GST_FIXME(…)
  • GST_TRACE(…)

这一组最简洁,log输出时,只需要输出内容,其中category为GST_CAT_DEFAULT,obj为NULL。

 注: 官方建议不要在代码中轻易使用printf或g_print之类的函数,因为他们无法控制是否输出       

2,日志级别定义:

https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html

  • 0: 什么都不打印
  • 1: 打印error的信息
  • 2: 打印error,warning 的信息
  • 3: 打印error warning,FIXME的信息
  • ...

3,控制日志输出:

3.1. 使用命令行参数开启或设置debug信息

–gst-debug-level=LEVEL 
其中LEVEL的取值为[0,9], 使用这种方式将同时开启/关闭所有模组的 debug信息,可能会导致debug信息过多而影响关键信息的获取

–gst-debug=STRING 
其中STRING为字符串,使用这种方式只输出由STRING指定范围内的调试信息,格式为 : category_name:LEVEL, 如果要设置多个类别时,每个类别设置之间使用“,”分开,例如:–gst-debug=”videodecoder:5,fdsrc:4,oggdemux:3”

3.2. 使用环境变量开启或设置debug信息

gstreamer中还可以使用环境变量开启或关闭debug信息,此环境变量为:GST_DEBUG,其使用方式和命令行参数 –gst-debug 一样,都是有一对对 category_name:LEVEL 这样的二元组构成,二元组与二元组之间使用 “,”(逗号)隔开。

 注意: 
    1. 二元组与二元组之间只能用逗号隔开,其不能有空格等其他符号; 
    2. category_name支持"*"通配符, 如 "GST_ELEMENT_*:4"
比如:

cat /etc/profile下增加GST_DEBUG变量(ffdecode,ffencode都是element,6是日志级别):

export GST_DEBUG=ffdecode:6,ffencode:6

3.3. 在代码中动态设置debug等级

在前面提到的两种开启或设置debug信息的方式都是在调用gst_init()函数期间完成的。也就是说它们有一个缺点,就是无法在运行过程中动态的调整debug信息的输出方式与等级,要实现这一个功能就需要通过调用一些函数接口的方式来动态调整log信息的输出等级。

  • gst_debug_set_default_threshold(level) //控制全局(所有类别)的log等级
  • gst_debug_set_threshold_for_name(name, level) //控制某一个类别的log等级,如:xxx(“videodecoder”, 5)
  • gst_debug_set_threshold_from_string(list, reset)//和GST_DEBUG类似,也是支持同时设置多个元组的log信息,后面一个reset参数: TRUE:清除之前的log输出设置信息,FALSE:将设置信息添加到现有的log信息设置当中
     

4,定义自己的LOG模块:

4.1,element实现的.c文件开始位置增加如下代码:

GST_DEBUG_CATEGORY_STATIC (gst_ff_enc_ele_debug);
#define GST_CAT_DEFAULT gst_ff_enc_ele_debug

4.2,element的*_class_init函数增加如下代码:

  GST_DEBUG_CATEGORY_INIT(gst_ff_enc_ele_debug, "ffEnc",
      0, "ffmpeg Encode");

 

参考资料:

  1. https://blog.youkuaiyun.com/knowledgebao/article/details/82802454
  2. https://blog.youkuaiyun.com/xuanwolanxue/article/details/62236413

有任何问题,请联系:knowledgebao@163.com

 

WARNING: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: Failed to fetch URL file://gst-plugins-base-1.16.2.tar.xz, attempting MIRRORS if available ERROR: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: Fetcher failure: Unable to find file file://gst-plugins-base-1.16.2.tar.xz anywhere. The paths that were searched were: /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/bstos /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/bstos /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/bstos /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/a1000 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/a1000 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/a1000 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/aarch64 /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base-1.16.2/ /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/ /home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/files/ /home/bstos/build/../downloads ERROR: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: Fetcher failure for URL: 'file://gst-plugins-base-1.16.2.tar.xz'. Unable to fetch URL from any source. ERROR: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: ERROR: gstreamer1.0-plugins-base-1.16.2-r0 do_fetch: Function failed: base_do_fetch ERROR: Logfile of failure stored in: /home/bstos/build/tmp/work/aarch64-bst-linux/gstreamer1.0-plugins-base/1.16.2-r0/temp/log.do_fetch.24397 ERROR: Task (/home/bstos/openembedded-core/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.16.2.bb:do_fetch) failed with exit code '1'
最新发布
09-29
<think>我们正在处理的是Yocto构建中关于gstreamer1.0-plugins-base在do_fetch阶段无法获取本地文件的问题。具体来说,错误是找不到`file://gst-plugins-base-1.16.2.tar.xz`。 根据问题描述,我们需要分析为什么do_fetch阶段无法获取这个本地文件。在Yocto中,`file://`协议用于指定本地文件系统中的文件,通常这些文件存放在配方(recipe)所在的目录下的`files`子目录中,或者放在由`FILESPATH`变量指定的路径中。 可能的原因和解决方案: 1. **文件不存在于预期位置**:检查配方中指定的文件是否确实存在于配方目录下的`files`子目录中。或者,检查是否通过`SRC_URI`正确指定了文件路径。 2. **文件路径设置错误**:Yocto通过`FILESPATH`变量来搜索文件。如果文件不在默认路径下,可能需要修改`FILESPATH`变量或显式指定路径。 3. **网络设置问题**:虽然使用的是`file://`协议,但Yocto构建环境有时会因为网络设置(如`BB_NO_NETWORK`)而影响本地文件的获取。例如,如果设置了`BB_NO_NETWORK = "1"`,则构建系统将不允许任何网络访问,但通常不会影响本地文件。不过,我们也可以检查一下该设置。 4. **文件权限问题**:确保构建用户对文件有读取权限。 5. **配方中的SRC_URI设置**:检查配方的`SRC_URI`是否包含了该文件。例如,在配方中应该有类似: ``` SRC_URI = "file://gst-plugins-base-1.16.2.tar.xz" ``` 或者,如果文件在子目录中,可能需要指定路径: ``` SRC_URI = "file:///path/to/file/gst-plugins-base-1.16.2.tar.xz" ``` 但通常,我们不会使用绝对路径,而是将文件放在配方所在目录的`files`子目录中。 6. **多个文件冲突**:如果有多个同名的文件位于不同的路径,Yocto可能会优先使用其中一个而忽略其他,导致找不到文件。 解决方案步骤: 步骤1:确认文件位置 - 首先找到gstreamer1.0-plugins-base的配方(recipe)。通常,这个配方的名称类似于`gstreamer1.0-plugins-base_1.16.2.bb`。 - 在配方所在的目录下,应该有一个名为`files`的目录,并且`gst-plugins-base-1.16.2.tar.xz`文件应该位于该目录中。 步骤2:检查SRC_URI - 打开配方文件,查看`SRC_URI`变量是否包含了对该文件的引用。它应该包含类似于: ``` SRC_URI = " \ http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-${PV}.tar.xz \ file://gst-plugins-base-1.16.2.tar.xz \ " ``` 注意:这里可能同时指定了多个来源,包括网络下载和本地文件。但通常,我们不会同时指定同一个文件的不同来源(除非有补丁等)。实际上,这里可能只需要网络下载,而不需要本地文件。所以,如果配方中同时指定了网络和本地文件,可能会导致冲突。 步骤3:检查文件是否存在 - 进入配方所在目录的`files`子目录,确认`gst-plugins-base-1.16.2.tar.xz`文件是否存在。 - 如果没有,需要将文件放入该目录,或者修改`SRC_URI`指向正确的路径。 步骤4:检查构建环境的下载目录(DL_DIR) - 有时,即使使用`file://`,Yocto也会尝试将文件复制到下载目录(DL_DIR)。检查下载目录中是否有该文件。如果之前构建失败,可能会导致下载目录中的文件不完整,可以尝试删除下载目录中的该文件,让Yocto重新复制。 步骤5:检查构建日志 - 查看失败任务的日志,通常在`tmp/work/.../temp/log.do_fetch`。日志会显示搜索文件的具体路径,以及为什么没有找到。 步骤6:调整文件搜索路径 - 如果文件不在默认的`files`子目录中,可以在配方中添加一行来扩展`FILESEXTRAPATHS`。例如: ``` FILESEXTRAPATHS_prepend := "${THISDIR}/files:" ``` 这将把当前配方目录下的`files`子目录添加到文件搜索路径中。 步骤7:检查网络设置 - 查看`local.conf`中是否有设置`BB_NO_NETWORK = "1"`。这个设置会禁止从网络下载,但不会禁止本地文件。不过,为了排除网络设置对整体构建环境的影响,可以尝试将其设为0(如引用[4]中的修改): ``` BB_NO_NETWORK = "0" ``` 然后再次尝试构建。 步骤8:手动获取文件 - 如果文件确实不存在,我们可以手动下载该文件并放到正确的位置。根据引用[2],我们可以从https://gstreamer.freedesktop.org/src/下载对应版本的源码包。 具体操作: 1. 下载源码包: ``` wget https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.16.2.tar.xz ``` 2. 将下载的文件放入配方目录的`files`子目录中(如果没有则创建)。 3. 重新运行构建。 如果问题仍然存在,我们可以尝试清理状态并重新构建: ``` bitbake -c cleansstate gstreamer1.0-plugins-base bitbake gstreamer1.0-plugins-base ``` 注意:如果配方中同时指定了网络下载(如`http://`)和本地文件(`file://`),那么Yocto会尝试多个来源。如果网络下载失败,它会尝试本地文件。但这里错误是找不到本地文件,所以可能是本地文件没有正确放置。 根据引用[2]和引用[3],我们也可以考虑使用系统包管理器安装Gstreamer开发包,但对于Yocto构建,我们是要为目标设备构建,所以必须使用Yocto的构建系统。 总结:重点检查文件是否在正确位置,以及配方的`SRC_URI`是否设置正确。 相关问题: 1. Yocto构建中如何管理本地源文件(file://)? 2. 如何为Yocto配方添加自定义补丁或文件? 3. Yocto构建中`do_fetch`任务的工作原理是什么? 4. 如何设置Yocto构建系统使用代理下载文件? </think>### 解决 `gstreamer1.0-plugins-base-1.16.2-r0` do_fetch 阶段文件获取问题 #### 问题原因分析 `do_fetch`阶段无法获取 `file://gst-plugins-base-1.16.2.tar.xz` 文件,通常由以下原因引起: 1. **本地文件路径错误**:Yocto 在 `FILESPATH` 指定路径中找不到文件 2. **源码包缺失**:所需的 `tar.xz` 文件未正确放置或下载 3. **网络访问限制**:`BB_NO_NETWORK=1` 设置阻塞备用下载源[^4] 4. **权限问题**:构建用户无权访问文件目录 #### 解决方案步骤 ##### 1. **验证源码包位置** 检查文件是否在正确路径(默认位置): ```bash ls ${TINA_TOPDIR}/repo/dl/gst-plugins-base-1.16.2.tar.xz ``` 若文件不存在: ```bash wget https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.16.2.tar.xz \ -P ${TINA_TOPDIR}/repo/dl/ ``` ##### 2. **配置本地文件路径** 在 `conf/local.conf` 添加显式路径声明: ```conf # 添加本地文件搜索路径 FILESEXTRAPATHS_prepend := "${TINA_TOPDIR}/repo/dl:" ``` ##### 3. **启用网络备用下载** 修改网络访问设置(参考引用[4]): ```diff - BB_NO_NETWORK = "1" + BB_NO_NETWORK = "0" ``` 允许在本地文件缺失时从上游下载[^4] ##### 4. **检查文件权限** 确保构建用户有访问权限: ```bash chmod -R u+rw ${TINA_TOPDIR}/repo/dl chown -R $USER:$USER ${TINA_TOPDIR}/repo/dl ``` ##### 5. **清理并重建** 执行完整重建流程: ```bash bitbake -c cleansstate gstreamer1.0-plugins-base bitbake -c fetch gstreamer1.0-plugins-base bitbake gstreamer1.0-plugins-base ``` #### 关键配置说明 ```mermaid graph LR A[do_fetch失败] --> B{检查本地文件} B -->|存在| C[验证路径配置] B -->|不存在| D[下载或放置文件] C --> E[检查FILESEXTRAPATHS] E --> F[检查BB_NO_NETWORK] F -->|=1| G[改为=0] F -->|=0| H[检查文件权限] H --> I[重建任务] ``` #### 验证是否解决 检查 `do_fetch` 日志确认成功: ```bash cat tmp/work/*/gstreamer1.0-plugins-base*/temp/log.do_fetch | grep "Success" # 应显示:Successfully extracted /path/to/gst-plugins-base-1.16.2.tar.xz ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值