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 clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git
不指定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参数可以在已经有了build目录的情况下重新configure:
# reconfigure
meson --reconfigure build
prefix用于指定安装目录,指定后就可以通过meson install安装到相应的目录:
meson --reconfigure build --prefix=/home/hui/disk4t/codes/gstreamer/gst-open-source/gstreamer-meson/gstreamer/build/out
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.')
cd build
ninja
或者
ninja -C build
如果没有设置prefix,会安装到/usr/local
sudo ninja install
meson --reconfigure -Dlibav=enabled build
或者
meson -Dgst-plugins-ugly:x264=enabled -Dlibav=enabled build
enabled:
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
编译完成后,gstreamer没有生成install目录,要使用gstreamer可以通过devenv参数指定生成一个虚拟的gstreamer环境,方便的使用gst-launch,gst-inspect等工具。
ninja -C build devenv
或者在build目录下直接执行
ninja devenv
执行这个命令后就可以使用新编译的gst-launch,gst-inspect等工具了。
Build options
gstreamer-full : NO
注册多个插件,用;
分隔
enable:
-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
编译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以后,编译就可以了。
增加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
$ 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/目录。
在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.
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