【编译gstreamer插件-multifilesrc】

  • Post author:
  • Post category:其他


本文以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解析】

应用中不能处理文件名不按顺序排列的问题,具体问题描述可以参考下面两个链接:



版权声明:本文为hello_dear_you原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。