点击查看系列文章目录
deepstream是基于gstreamer开发的,因此里边涉及的基本概念都是gstreamer中的,比如element、pipeline、pad等等,这些基本概念大家可以参考《GStreamer基础教程2:基本概念》。当然不比纠结这些名词的定义,大家在使用过程中,会逐渐了解这些概念的。
本文我们介绍的一个工具是pipeline分析工具。我们创建deepstream应用时,本质上就是在创建不同的pipeline,有了pipeline才能实现各种各样的功能。但对于初学者来说,手动创建pipeline不是一件容易的事情。如果有一个可视化的工具,能把pipeline的结构显示出来,岂不是很直观。话不多说,接下来就介绍如何实现这个功能。
在开始之前,假设你的系统上已经安装过gstreamer库,唯一需要安装的依赖是graphviz,这个工具可以将我们调试生成的.dot文件转化为图像或者pdf文件,便于查看
sudo apt-get install graphviz
有两种方式可以创建pipeline,即使用gst-launch-1.0和使用应用程序的方式。但无论哪种方式,我们都需要先定义一下GST_DEBUG_DUMP_DOT_DIR
环境变量,GStreamer使用此环境变量作为生成的管线图的输出位置。我们直接修改~/.bashrc文件
export GST_DEBUG_DUMP_DOT_DIR=/home/nvidia/pipeline/
修改后source ~/.bashrc,gstreamer不会自动创建该路径 ,需要你提前创建好
如果您使用gst-launch-1.0
,则每次更改pipeline状态时都会生成一个新的pipeline图。如果您想了解程序运行期间pipeline的演变方式,这将特别有用。gst-launch-1.0的使用方法参考《
GStreamer基础教程10:GStreamer工具》,这里不阐开介绍。
每次运行gst-launch-1.0指令后,就会在上边环境变量设置的目录里生成dot文件。
如果您使用的是自定义GStreamer应用程序,则需要使用GStreamer调试宏来触发管道生成。
例如,要查看完整的管道图,可以在应用程序中创建并链接完pipeline element的位置添加以下宏调用:
GST_DEBUG_BIN_TO_DOT_FILE(pipeline, GST_DEBUG_GRAPH_SHOW_ALL, "pipeline")
eg:GST_DEBUG_BIN_TO_DOT_FILE (GST_BIN (appCtx->pipeline.pipeline),GST_DEBUG_GRAPH_SHOW_ALL,"ds-app-playing");
GST_DEBUG_BIN_TO_DOT_FILE 宏的定义如下
#define GST_DEBUG_BIN_TO_DOT_FILE(bin, details, file_name) gst_debug_bin_to_dot_file (bin, details, file_name)
其中gst_debug_bin_to_dot_file原型定义如下
gst_debug_bin_to_dot_file (GstBin * bin,
GstDebugGraphDetails details,
const gchar * file_name)
第一个参数是要分析的pipeline;
第二个参数是输出图所包含的信息情况,共有以下选择
GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE (1) – show caps-name on edges
GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS (2) – show caps-details on edges
GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS (4) – show modified parameters on elements
GST_DEBUG_GRAPH_SHOW_STATES (8) – show element states
GST_DEBUG_GRAPH_SHOW_FULL_PARAMS (16) – show full element parameter values even if they are very long
GST_DEBUG_GRAPH_SHOW_ALL (15) – show all the typical details that one might want
GST_DEBUG_GRAPH_SHOW_VERBOSE (4294967295) – show all details regardless of how large or verbose they make the resulting output
第三个参数是输出文件的名字。
除了GST_DEBUG_BIN_TO_DOT_FILE 这个宏以外,还有GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS可以使用,参数及使用方法与GST_DEBUG_BIN_TO_DOT_FILE 完全相同,区别在于输出文件带有时间戳信息,便于我们获得不同时刻创建的pipeline情况。如果自己的pipeline没有经常改变,我们使用GST_DEBUG_BIN_TO_DOT_FILE产生一次pipeline图即可。
如果运行后没有如期生成dot文件,可以再执行下设置环境变量的指令。
经过上述步骤生成的dot文件不能直接打开,我们需要使用graphviz工具来转换成图片或者pdf文件
使用方式如下
dot -T{format} input_file > output_file
例如转化成pdf文件
dot -Tpdf ***.dot > ***.pdf
转化成png图像
dot -Tpng ***.dot > ***.png
转化成jpg图像
dot -Tjpg ***.dot > ***.jpg
如果你经常使用gst-launch-1.0
来进行管道测试,会在目录下生成一堆dot文件,你可以使用下边的脚本来批量转换
#!/bin/sh
MESON_BUILD_ROOT="${MESON_BUILD_ROOT:-build}"
INPUT_DIR="${INPUT_DIR:-$MESON_BUILD_ROOT/pipeline}"
if [ -d "$INPUT_DIR" ]; then
DOT_FILES=`find build/pipeline -name "*.dot"`
for file in $DOT_FILES
do
dest=`sed s/.dot/.pdf/ <<< "$file"`
dot -Tpdf $file > $dest
done
else
echo "Input directory $INPUT_DIR does not exist"
fi