GStreamer编译安装——使用Meson从源代码编译

发布于:2024-06-16 ⋅ 阅读:(24) ⋅ 点赞:(0)

使用Meson从源代码编译

如果您只想使用GStreamer,请访问下载页面。 我们为Windows、macOS、Android和iOS提供预构建的二进制文件

对于希望处理GStreamer代码本身和/或修改它的开发人员,或者希望快速尝试尚未在GStreamer正式版本中的功能的应用程序开发人员,这是推荐的设置。

注意:这仅适用于在Linux、Windows和macOS上进行GStreamer开发。如果您:

  1. 想为Android、iOS或UWP做GStreamer开发,或者
  2. 必须构建GStreamer包以进行分发或部署,或
  3. 需要没有Meson端口的具有外部依赖项的插件

请参阅使用Cerbero构建, 可用于构建特定的GStreamer版本或构建未发布的版本 GStreamer代码。

Meson、gst-build和GStreamer monorepo是什么?

介子构建系统Meson介子构建系统是一个便携式构建系统,它是快速和 旨在比替代品更用户友好。它生成构建 指令可以由ninja执行。GStreamer project将其用于所有子项目。

2021年9月,所有主要的GStreamer模块都合并到一个 单一代码存储库,GStreamer单一存储库存在 在主GStreamer git存储库中,这是所有 GStreamer开发现在发生在GStreamer版本1.19/1.20及更高版本。

在mono存储库合并不同的GStreamer模块之前 单独的git存储库,并且有一个单独的meta-builder项目 调用gst-build来下载和构建所有子项目。 这是你应该使用如果你想建立或发展对旧稳定的分支,例如GStreamer 1.16或1.18。

如果您想针对即将到来的开发或稳定的分支进行构建或开发 您应该使用包含mono的GStreamer模块的main分支 存储库。

在以下部分中,我们将只讨论GStreamer单声道存储库, 但gst-build的工作方式基本相同,唯一的区别是 它也会下载各种GStreamer子模块。

设置与Meson构建

为了构建当前的GStreamer开发版本,该版本将在不久的将来成为1.20稳定分支,克隆GStreamer mono存储库:

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

或者,如果您有权访问存储库:

git clone git@gitlab.freedesktop.org:gstreamer/gstreamer.git
cd gstreamer

如果要构建稳定的1.18或1.16分支,请克隆gst-build

git clone https://gitlab.freedesktop.org/gstreamer/gst-build.git
cd gst-build

存储库布局

该存储库包含一些值得注意的脚本和目录:

  1. meson.build是顶级构建定义,它将递归地 配置所有依赖项。它还定义了一些帮助命令,允许您 拥有开发环境或轻松更新git GStreamer模块的存储库。
  2. subprojects/是包含GStreamer模块和 选择的依赖项。

Meson和ninja 的基本用法

配置一个模块(或在gst-build中一次配置多个模块)通过执行:

meson setup <build_directory>

build_directory是所有构建指令和输出的位置 位于(这也称为“目录外”建筑)。如果目录是没有创建,它将在这一点上完成。请注意,旧版本的meson 可以在没有任何命令参数的情况下运行,现在已弃用。

关于build_directory的位置只有一个限制: 它不能与源目录相同(即您克隆模块的位置)。 它可以在该目录之外,也可以在该目录的/下方。

meson 配置完成后,您可以:

  1. 进入指定的构建目录并运行ninja。

    cd <build_directory>
    ninja
    
  2. 或者不是每次都切换到构建目录 执行ninja命令,您可以将构建目录指定为 参数。此选项的优点是您可以从任何地方运行它 (而不是切换到ninja目录)

    ninja -C </path/to/build_directory>
    

这将从该模块构建所有内容(以及构建gst-build或mono存储库时的子项目)。

注意:修改源文件时不需要重新运行meson,只需 需要重新运行ninja。如果构建/配置文件更改,ninja将 自己找出meson需要重新运行并会这样做自动。

进入开发环境

GStreamer由多个工具、插件和组件组成。为了使它 易于开发和测试,有一个目标(由gst-build 或者单声道存储库,将来直接由meson本身) 相应地设置环境变量,以便您可以使用所有直接构建结果。

对于任何熟悉python和虚拟环境的人来说,您会有宾至如归的感觉。

脚本称为gst-env.py,它位于 GStreamer单一存储库。

另一种进入虚拟环境的方法是执行ninja -C <path/to/build_directory> devenv。此选项选项较少,并且是 因此与某些工作流程不兼容。

注意:您不能在虚拟环境中使用meson或使用ninja重新配置 环境,因此在进入环境之前构建或从 另一个终端/终端选项卡。

它是如何工作的?

使用一组特定的环境变量启动一个新的shell会话,告诉GStreamer在哪里可以找到插件或库。

最重要的选项是:

  • Shell上下文相关变量
    • PATH-用于搜索可执行文件的系统路径,gst-env将 附加包含构建目录中可执行文件的文件夹。
    • GST_PLUGIN_PATH-搜索插件的路径列表(.so/.dll 文件),gst-env将添加在 GstPluginsPath.json文件和其他几个位置。
    • GST_PLUGIN_SYSTEM_PATH-设置后,这将使GStreamer检查 插件在系统范围的路径,这是保持空白的目的由gst-env到 避免使用安装在环境之外的插件。
    • GST_REGISTRY-使用自定义文件作为插件缓存/注册表。gst-env 使用在给定构建目录中找到的那个。
  • Meson(构建环境)相关变量
    • GST_VERSION-在介子中设置构建版本。
    • GST_ENV-确保介子或忍者都不会从内部逃跑 gst-env。可用于识别环境是否处于活动状态。
  • 验证(测试运行者)相关变量
    • GST_VALIDATE_SCENARIOS_PATH-搜索验证的路径列表 场景文件(管道要执行的操作列表)。默认情况下 gst-env将使用在 prefix/share/gstreamer-1.0/validate/scenarios目录中的父 目录的gst-env.py
    • GST_VALIDATE_PLUGIN_PATH-搜索插件文件的路径列表 添加到插件注册表。默认搜索路径在给定的构建中 目录下的subprojects/gst-devtools/validate/plugins

总体思路是设置meson 构建目录,构建项目和切换到使用gst-env开发环境 shell中的开发环境,提供一组单独的插件和工具。 要检查您是否在开发环境中运行:echo $GST_ENV,它将由gst_env设置为gst-$GST_VERSION

您会注意到提示相应更改。然后,您可以运行任何GStreamer 您刚刚直接构建的工具(如gst-inspect-1.0gst-launch-1.0,…)。

选项gst-env 

  • builddir 

    • 默认情况下,脚本将尝试在 buildbuilddir目录在同一文件夹中 gst-env.py。此选项允许指定 不同的位置。当您有多个不同的 构建但您不想在文件夹之间跳转。
  • srcdir

    • 默认使用gst-env.py的父文件夹。 此选项用于获取存储库的当前分支,以获取 用于gdb的插件。
  • sysroot

    • 如果项目在另一台机器上交叉编译并通过网络文件系统/ssh文件系统/等挂载,则很有用。通过删除与sysroot匹配的路径的前面部分来调整路径(例如在GST_PLUGIN_PATH中找到的路径)。

    例如,如果你的rootfs /srv/rootfs,那么v4l2codecs插件 可能建于 /srv/rootfs/home/user/gstreamer/build/subprojects/gst-plugins-bad/sys/v4l2codecs. 通过执行gst-env.py --sysroot /srv/rootfs路径将被存储 在GST_PLUGIN_PATH内: /home/user/gstreamer/build/subprojects/gst-plugins-bad/sys/v4l2codecs.

  • wine

    • 使用特定的Wine命令扩展GST_VERSION环境变量
  • winepath

    • 为wine 环境的WINEPATH变量添加其他元素。
  • only-environment

    • 不要打开新的shell环境,而是打印将要使用的环境变量。

用例

在保持分发包的同时设置开发环境

这个案例非常简单,你所要做的就是:

  • ./gst-env.py从项目根目录
  • ninja -C build devenv(build是生成的介子构建目录)
  • meson devenv从介子构建目录(例如build)中 项目根
使用GStreamer作为另一个项目的子项目

这个案例与之前非常相似,唯一重要的偏差是 文件系统结构很重要。gst-env将寻找一个 GstPluginPaths.json文件在介子构建目录(例如: build)或在build/subprojects/gstreamer

与网络共享相结合的交叉编译

对于交叉编译,一般来说,看看meson留档或项目 比如gst-build-sdk

基本思想是在交叉编译主机上准备一个rootfs,即 与目标机器相似,准备一个  cross-file.txt, 构建项目并通过 NFS mount/NFS rootfs/SSHFS/Syncthing等。

然后,在目标机器上,您必须从GStreamer路径中删除构建机器上rootfs的路径:

  • ./gst-env.py --sysroot /path/to/rootfs-on-cross-compile-host

使用多个分支或远程操作

跟踪多个git远程存储库(例如官方上游存储库和您在gitlab上的个人克隆)并不少见。

在gstreamer mono存储库中,只需像使用任何其他git存储库一样添加您的个人git 远程,例如:

git remote add personal git@gitlab.freedesktop.org:awesomehacker/gstreamer.git
git fetch

在gst-build(用于1.16/1.18分支)中,您可以在相关的子项目目录中添加您的个人git远程文件(这必须针对每个感兴趣的子项目进行,因为旧的1.16/1.18分支位于单独的git存储库中),例如:

cd subprojects/gstreamer/
git remote add personal git@gitlab.freedesktop.org:awesomehacker/gstreamer.git
git fetch

配置

您可以使用meson项目的 配置命令:

meson configure

如果您有一个已经配置的构建目录,您可以提供它,并且您还将获得该构建的配置值:

meson configure <build-directory>

该命令将列出每个选项:

  • 选项的名称
  • 选项的默认(或配置)值
  • 可能的值
  • 该选项的描述

值与auto意味着meson将计算出在配置时间 正确的值(例如,如果您有可用的开发包 构建某个插件)。

您还将看到带有<inherited from main project>的值。这主要是 用于泛型选项。例如,doc选项是 存在于顶层,也存在于每个子模块(例如: gstreamer:doc)。通常你只想设置该选项的值 一次,所有子模块都将继承。

然后,您可以在配置构建时向meson提供这些选项 -D<option_name>=<option_value>。例如,如果不想构建 Rust插件在gst-buildrs选项),你会做:

meson -Drs=disabled <build-directory>

您还可以查看meson_options.txt文件和subproject/xyz/meson_options.txt 列出各种项目特定构建选项的文件。 然而,这些不包括所有标准meson选项。

运行测试

运行单元测试是通过从构建目录调用meson test来完成的, 或meson test -C <path/to/build_directory>。如果有任何失败你可以 看看最后指定的文件,或者你可以运行meson test --print-errorlogs,它会显示失败测试的日志 执行。

您还可以通过指定名称名称来仅执行测试的子集。对于 示例meson test gst_gstpad。完整的测试列表可从 meson test --list

如果构建gst-devtools子模块,还可以使用 gst-validate-launchergst验证运行测试。

gst-validate-launcher check.gst*

进一步探索

更多详细信息可在GStreamer单存储库自述文件中找到 或(对于较旧的1.16/1.18分支)在gst-build留档中