本文以multifilesrc插件举例,修改编译其源码并替换
0. 下载gstreamer插件的源码
在
【Gstreamer之plugin教程二-filesrc】
中,介绍了如何下载相应插件的源代码。本文以multifilesrc举例,下载了相对应的源代码文件。
其中multifilesrc插件对应的代码路径为”gst-plugins-good-1.14.5/gst/multifile”
1. 编译gst-plugins-good-1.14.5
1. 确认当前系统中安装了gstreamer1.14.5,然后通过如下命令确认编译环境
./configure --prefix=/root/library/gst-plugins-good-1.14.5/bin
–prefix指定最终生成的的动态库安装的位置,默认情况下安装路径为”/usr/local”
ac_default_prefix=/usr/local
命令运行完成之后会出现如下语句
configure: *** Plug-ins without external dependencies that will be built:
...
matroska
multifile
...
configure: *** Plug-ins without external dependencies that will NOT be built:
monoscope
configure: *** Plug-ins that have NOT been ported:
configure: *** Plug-ins with dependencies that will be built:
cairo
gdkpixbuf
...
configure: *** Plug-ins with dependencies that will NOT be built:
1394
aasink
...
configure: *** Orc acceleration enabled.
2. 编译和安装
通过如下命令,编译和安装multifilesrc插件
cd gst/multifile/
make
sudo make install
make之后的log信息如下
CC test_splitmux_part_reader-test-splitmuxpartreader.o
CC test_splitmux_part_reader-gstsplitmuxpartreader.o
CC test_splitmux_part_reader-gstsplitmuxsrc.o
CC test_splitmux_part_reader-gstsplitutils.o
CC test_splitmux_part_reader-patternspec.o
CCLD test-splitmux-part-reader
CC libgstmultifile_la-gstmultifilesink.lo
CC libgstmultifile_la-gstmultifilesrc.lo
CC libgstmultifile_la-gstmultifile.lo
CC libgstmultifile_la-gstsplitfilesrc.lo
CC libgstmultifile_la-gstsplitmuxsink.lo
CC libgstmultifile_la-gstsplitmuxpartreader.lo
CC libgstmultifile_la-gstsplitmuxsrc.lo
CC libgstmultifile_la-gstsplitutils.lo
CC libgstmultifile_la-patternspec.lo
CCLD libgstmultifile.la
make install 完成之后,会在设置安装路径下得到这个一个文件结构
----------------------------------------------------------------------
Libraries have been installed in:
/home/yeah/libraries/gst-plugins-good-1.14.5/bin/lib/gstreamer-1.0
# 文件结构
lib/
└── gstreamer-1.0
├── libgstmultifile.la
└── libgstmultifile.so
其中libgstmultifile.so就是我们需要得到的动态链接库
2. 替换系统动态链接库
为了测试修改后的功能,我们需要用这个编译生成的so文件替换系统的so文件。
1. 找到系统so文件的位置
$ gst-inspect-1.0 multifilesrc
Plugin Details:
Name multifile
Description Reads/Writes buffers from/to sequentially named files
Filename /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstmultifile.so
Version 1.14.5
License LGPL
Source module gst-plugins-good
Source release date 2019-05-29
Binary package GStreamer Good Plug-ins source release
Origin URL Unknown package origin
根据上述的Filename属性可以得到系统的so库的路径。备份系统自带的so库文件。
cd /usr/lib/aarch64-linux-gnu/gstreamer-1.0/
mv libgstmultifile.so libgstmultifile.so.bak
2. 替换so库文件
cp lib/gstreamer-1.0/libgstmultifile.so /usr/lib/aarch64-linux-gnu/gstreamer-1.0/
3. 测试替换后multifilesrc的功能
下面给出了一个测试用的pipeline,功能是输入一系列顺序图像,并将其保存成一系列顺序不同名字的图像,仅仅是测试multifilesrc功能
gst-launch-1.0 multifilesrc location=test%d.jpg ! jpegparse ! jpegdec ! videoconvert ! jpegenc ! multifilesink location=output%d.jpg
4. 修改multifilesrc.c的代码重新编译并替换so文件测试效果
对multifilesrc.c的修改内容,只是在每个函数的前面加上printf语句表示该函数被调用,同时也可以了解mulfilesrc在处理数据时,函数的调用顺序,这对于后序分析multifilesrc的代码结构有很大的帮助。
*** gst_multi_file_src_class_init ***
*** gst_multi_file_src_uri_handler_init ***
*** gst_multi_file_src_uri_get_type ***
*** gst_multi_file_src_uri_get_protocols ***
*** gst_multi_file_src_class_init ***
*** gst_multi_file_src_uri_handler_init ***
*** gst_multi_file_src_init ***
*** gst_multi_file_src_set_property ***
*** gst_multi_file_src_set_location ***
*** gst_multi_file_src_query ***
*** gst_multi_file_src_getcaps ***
*** gst_multi_file_src_query ***
*** gst_multi_file_src_getcaps ***
Setting pipeline to PAUSED ...
*** gst_multi_file_src_query ***
*** is_seekable ***
*** do_seek ***
Pipeline is PREROLLING ...
*** gst_multi_file_src_query ***
*** gst_multi_file_src_uri_get_uri ***
*** gst_multi_file_src_query ***
*** gst_multi_file_src_getcaps ***
*** gst_multi_file_src_create ***
*** gst_multi_file_src_get_filename ***
*** gst_multi_file_src_query ***
*** is_seekable ***
*** gst_multi_file_src_query ***
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
*** gst_multi_file_src_query ***
New clock: GstSystemClock
*** gst_multi_file_src_create ***
*** gst_multi_file_src_get_filename ***
*** gst_multi_file_src_create ***
*** gst_multi_file_src_get_filename ***
*** gst_multi_file_src_create ***
*** gst_multi_file_src_get_filename ***
Got EOS from element "pipeline0".
Execution ended after 0:00:00.039199000
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
*** gst_multi_file_src_dispose ***
上述为替换so链接库,运行pipeline之后得到的log信息,其中有意义的信息是:gst_multi_file_src_class_init和gst_multi_file_src_init的调用;gst_multi_file_src_set_property和gst_multi_file_src_set_location的调用;
gst_multi_file_src_create和gst_multi_file_src_get_filename的调用,总共测试了3张图像,这两个函数总共调用了四种,通过后序的代码阅读会发现这两个函数在更新图像的index信息。
通过上述的分析,我们可以修改multifilesrc的源码更改其寻找下一帧数据路径的方式来解决
【deepstream-image-decode-test解析】
应用中不能处理文件名不按顺序排列的问题,具体问题描述可以参考下面两个链接: