当前位置: 首页 > 工具软件 > Meson > 使用案例 >

使用meson编译gstreamer

赫连彬炳
2023-12-01

Meson构建系统是一个可移植的构建系统,它速度快,更容易使用。它可以生成构建指令,然后由ninja执行。

在2021年9月,所有主要的GStreamer模块都被合并到一个代码库中,即GStreamer mono repo,它存在于主要的GStreamer git仓库中,现在GStreamer 1.19/1.20及以后的版本都在这里进行开发。

在mono仓库合并之前,不同的GStreamer模块分布在不同的git仓库中,有一个单独的元构建项目,叫做gst-build,用于下载和构建所有的子项目。如果想针对较早的稳定分支(如GStreamer 1.16或1.18)进行构建或开发,应该使用这个项目。

软件需求

  • git
  • python 3.5+
  • Meson 0.59+

1. 下载gstreamer

git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git

2. configure

不指定option的情况下,执行meson,会按默认的规则编译,是不带libav,x264的。

cd gstreamer
meson build

####= list options
要想知道都有那些option,通过 meson configure命令和grep组合就可以方便的找到想要的option:

$ meson configure

$ meson configure | grep 264
 x264        auto                             [enabled, disabled, auto] 

$ meson configure | grep libav
  libav      auto                             [enabled, disabled, auto]        libav

reconfigure

指定reconfigure参数可以在已经有了build目录的情况下重新configure:

# reconfigure
meson --reconfigure build

指定prefix

prefix用于指定安装目录,指定后就可以通过meson install安装到相应的目录:

meson --reconfigure build --prefix=/home/hui/disk4t/codes/gstreamer/gst-open-source/gstreamer-meson/gstreamer/build/out

meson options

gstreamer/subprojects/gst-plugins-ugly/meson_options.txt

在meson_options.txt可以找到option的定义:

# Common options
option('package-name', type : 'string', yield : true,
       description : 'package name to use in plugins')
option('package-origin', type : 'string', value : 'Unknown package origin', yield: true,
       description : 'package origin URL to use in plugins')
option('doc', type : 'feature', value : 'auto', yield: true,
       description: 'Enable documentation.')

3. 编译

cd build
ninja

或者

ninja -C build

4. install

如果没有设置prefix,会安装到/usr/local

sudo ninja install

5. libav和x264的支持

meson --reconfigure -Dlibav=enabled build

或者

meson -Dgst-plugins-ugly:x264=enabled -Dlibav=enabled build

enabled:

  • libav
  • x264
  • gst-full-plugins
meson --reconfigure  -Dlibav=enabled -Dgst-plugins-ugly:x264=enabled -Dgpl=enabled -Dgst-examples=enabled -Dgst-full-plugins=enabled build

option如何制定在Readme.md文件中有详细说明。

configure过程中发现libsoup-2.4库没有

gst-examples| Run-time dependency libsoup-2.4 found: NO (tried pkgconfig and cmake)
gst-examples| Looking for a fallback subproject for the dependency libsoup-2.4

pkg-config查询,确实没有 libsoup-2.4库:

$ pkg-config --modversion libsoup-2.4
Package libsoup-2.4 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libsoup-2.4.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libsoup-2.4' found

安装 libsoup2.4-dev,configure就没问题了:

sudo aptitude install libsoup2.4-dev

然后重新运行meson configure

meson --reconfigure  -Dlibav=enabled -Dgst-plugins-ugly:x264=enabled -Dgpl=enabled -Dgst-examples=enabled build

# 省略很多输出...

gstreamer-full 1.19.3.1

  Build options
    gstreamer-full            : NO

  Subprojects
    dssim                     : YES
    dv                        : YES
    fdk-aac                   : YES
    gl-headers                : YES 2 warnings
    graphene                  : YES
    gst-devtools              : YES 3 warnings
    gst-editing-services      : YES 2 warnings
    gst-examples              : YES
    gst-integration-testsuites: YES
    gst-libav                 : YES
    gst-omx                   : NO Feature 'omx' disabled
    gst-plugins-bad           : YES 3 warnings
    gst-plugins-base          : YES 2 warnings
    gst-plugins-good          : YES 2 warnings
    gst-plugins-rs            : NO Feature 'rs' disabled
    gst-plugins-ugly          : YES 2 warnings
    gst-python                : NO Subproject "subprojects/pygobject" required but not found.
    gst-rtsp-server           : YES
    gstreamer                 : YES 2 warnings
    gstreamer-sharp           : NO Feature 'sharp' disabled
    gstreamer-vaapi           : NO Feature 'vaapi' disabled
    gtest                     : YES
    json-glib                 : YES 2 warnings
    lame                      : YES
    libmicrodns               : YES
    libnice                   : YES
    libopenjp2                : YES
    libsoup3                  : NO Neither a subproject directory nor a libsoup3.wrap file was found.
    ogg                       : YES
    openh264                  : YES 10 warnings
    opus                      : YES 1 warnings
    orc                       : YES
    pygobject                 : NO Dependency 'glib-2.0' is required but not found.
    tinyalsa                  : NO Neither a subproject directory nor a tinyalsa.wrap file was found.
    vorbis                    : YES

  User defined options
    gpl                       : enabled
    gst-examples              : enabled
    gst-full-plugins          : enabled
    libav                     : enabled
    gst-plugins-ugly:x264     : enabled

最后能看到自己enable的option:

User defined options
    gpl                       : enabled
    gst-examples              : enabled
    libav                     : enabled
    gst-plugins-ugly:x264     : enabled

6. 使用gstreamer env

编译完成后,gstreamer没有生成install目录,要使用gstreamer可以通过devenv参数指定生成一个虚拟的gstreamer环境,方便的使用gst-launch,gst-inspect等工具。

ninja -C build devenv

或者在build目录下直接执行

ninja devenv

执行这个命令后就可以使用新编译的gst-launch,gst-inspect等工具了。

7. gstreamer-full选项

Build options
  gstreamer-full            : NO

注册多个插件,用;分隔

enable:

  • coreelements
  • playback
  • typefindfunctions
  • alsa
-Dgst-full-plugins=coreelements;playback;typefindfunctions;alsa

同一个plugin的feature之间用:开始,用,隔开

enabled:

  • filesrc [coreelements]

  • fakesink [coreelements]

  • alsasrc [coreelements]

  • alsasrc [alsa]

-Dgst-full-elements=coreelements:filesrc,fakesink;alsa:alsasrc

8. 处理编译错误

编译gst-plugins-good碰到编译错误如下:

subprojects/gst-plugins-good/tests/examples/qt/qmlsink-multisink/videoitem/videoitem.cpp:154:64: error: ‘class QSharedPointer<VideoItemPrivate>’ has no member named ‘get’

通过option去掉-Dgst-plugins-good:tests=disabled

meson  --reconfigure -Dgst-plugins-ugly:x264=enabled -Dlibav=enabled -Dgpl=enabled -Dgst-full-plugins=enabled -Dgst-plugins-good:tests=disabled build

meson configure输出来看是disabled的状态了,实际上编译还是会报错:

User defined options
  gpl                       : enabled
  gst-full-plugins          : enabled
  libav                     : enabled
  gst-plugins-good:tests    : disabled
  gst-plugins-ugly:x264     : enabled

最后只能修改meson.build文件

--- a/subprojects/gst-plugins-good/meson.build
+++ b/subprojects/gst-plugins-good/meson.build
@@ -452,7 +452,7 @@ endif
 subdir('gst')
 subdir('sys')
 subdir('ext')
-subdir('tests')
+#subdir('tests')
 subdir('docs')

去掉tests以后,编译就可以了。

9. 编译debug版本&去掉编译优化

增加option:

-Ddebug=true -Doptimization=0 
meson  --reconfigure -Dgst-plugins-ugly:x264=enabled -Dlibav=enabled -Dgpl=enabled -Dgst-full-plugins=enabled -Ddebug=true -Doptimization=0 build

最后输出:

 User defined options
    backend                   : ninja
    debug                     : true
    optimization              : 0
    gpl                       : enabled
    gst-full-plugins          : enabled
    libav                     : enabled
    gst-plugins-good:tests    : disabled
    gst-plugins-ugly:x264     : enabled

10. install

$ cd build
$ sudo meson install

执行install,如果没有指定prefix选项,plugin默认安装到/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/目录下,gst-launch和gst-inspect在/usr/local/bin/目录。


11. 如何才能编译subproject/FFmpeg

在subproject下的FFmpeg通常是不会参与编译的,因为通过pkg-config能从系统中找到,这个就不会下载了,如果需要编译这个ffmpeg,就需要让pkg-config找不到:

没有找到通过让pkg-config程序找不到ffmpeg的方法,手动删除了/usr/lib/pkgconfig下的libav相关的pc文件后,就可以进入下载FFmpeg代码的部分了,这个只能有空再研究下了。

Executing subproject gst-libav 

gst-libav| Project name: gst-libav
gst-libav| Project version: 1.20.2
gst-libav| C compiler for the host machine: ccache cc (gcc 7.4.0 "cc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0")
gst-libav| C linker for the host machine: cc ld.bfd 2.30
gst-libav| Run-time dependency libavfilter found: NO (tried pkgconfig and cmake)
gst-libav| Looking for a fallback subproject for the dependency libavfilter
Cloning into 'FFmpeg'...

glib的依赖也是一样,没有找到就会clone glib到subproject目录:

gstreamer| Run-time dependency glib-2.0 found: NO (tried pkgconfig and cmake)
gstreamer| Looking for a fallback subproject for the dependency glib-2.0
Cloning into 'glib'...
remote: Enumerating objects: 192935, done.

ERROR整理

ERROR undefined reference to png_xxx

gstreamer libQt5Gui.so: undefined reference to `png_set_interlace_handling@PNG16_0'

去掉examples编译,增加:-Dexamples=disabled

meson --reconfigure build -Dlibav=enabled -Dgst-plugins-ugly:x264=enabled -Dgpl=enabled -Dgst-full-plugins=enabled  -Dexamples=disabled -Dc_args=-save-temps=obj

 类似资料: