2. 开发环境搭建:交叉编译工具链配置、Gstreamer源码下载与编译、依赖库安装(glib、orc、libffi)、目标板部署验证
好,咱们正式开始动手了。这一章,说白了就是搭台子。台子搭不好,后面唱戏全得垮。我见过太多新手,上来就编译Gstreamer,结果卡在依赖库上三天三夜。嗯,咱们今天就把这些坑一个个填平。
2.1 交叉编译工具链配置
先说说工具链。你想想看,你的电脑是x86架构,目标板是ARM架构,代码怎么跑?必须得有个“翻译官”——交叉编译工具链。
我个人习惯用Linaro提供的工具链,稳定且社区支持好。以ARM Cortex-A7为例,我常用的是gcc-arm-linux-gnueabihf。
安装步骤:
- 下载工具链:
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz - 解压到
/opt目录:sudo tar -xvf gcc-linaro-*.tar.xz -C /opt - 配置环境变量,编辑
~/.bashrc,添加:
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
然后source ~/.bashrc生效。验证一下:
arm-linux-gnueabihf-gcc --version
2.2 Gstreamer源码下载与编译
Gstreamer的源码管理有点特殊,它是个“大家族”。核心库是gstreamer,但你还得下载gst-plugins-base、gst-plugins-good、gst-plugins-bad、gst-plugins-ugly。别被名字吓到,这些只是质量分类。
下载方式:
- 官方Git仓库:
git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git - 或者直接下载tar包:
wget https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.20.3.tar.xz
我个人推荐用tar包,省去切换分支的麻烦。解压后进入目录,开始配置:
./configure --host=arm-linux-gnueabihf \
--prefix=/opt/gst-arm \
--disable-gtk-doc \
--disable-examples \
--disable-tests \
--disable-benchmarks
这里要注意,--prefix指定安装路径,后面部署时直接拷贝这个目录到目标板就行。--disable-*是为了减少编译时间,毕竟嵌入式设备资源有限。
--host参数!我刚开始做的时候,忘了指定交叉编译,结果编译出来的是x86的二进制,放到板子上直接“Segmentation fault”。那叫一个郁闷。
2.3 依赖库安装:glib、orc、libffi
Gstreamer的依赖库,说白了就三个大头:glib(核心数据结构)、orc(优化编译器)、libffi(外部函数接口)。这三个必须提前交叉编译好。
2.3.1 编译libffi
libffi最简单,先搞它:
./configure --host=arm-linux-gnueabihf --prefix=/opt/gst-arm
make -j4
make install
2.3.2 编译glib
glib稍微复杂点,它依赖libffi和zlib。配置时记得指定:
./configure --host=arm-linux-gnueabihf \
--prefix=/opt/gst-arm \
--with-pcre=internal \
--disable-selinux \
--disable-libmount \
PKG_CONFIG_PATH=/opt/gst-arm/lib/pkgconfig
--with-pcre=internal这个参数很关键。我遇到过目标板上没有pcre库,导致glib运行时崩溃。用internal版本,直接把正则表达式支持编译进去,省心。
2.3.3 编译orc
orc是Gstreamer的“加速器”,用于SIMD优化。编译很简单:
./configure --host=arm-linux-gnueabihf --prefix=/opt/gst-arm
make -j4
make install
嗯,这里有个坑。orc编译时会检测主机CPU特性,但交叉编译时检测的是x86的,不是ARM的。解决办法:
export ORC_CFLAGS="-mcpu=cortex-a7 -mfpu=neon"
这样orc才能正确生成ARM的NEON优化代码。
2.4 目标板部署验证
编译完成后,把/opt/gst-arm整个目录拷贝到目标板上。我一般用NFS挂载,方便调试:
mount -t nfs -o nolock 192.168.1.100:/opt/gst-arm /mnt/gst
然后设置环境变量:
export LD_LIBRARY_PATH=/mnt/gst/lib:$LD_LIBRARY_PATH
export GST_PLUGIN_PATH=/mnt/gst/lib/gstreamer-1.0
export PATH=/mnt/gst/bin:$PATH
验证命令:
gst-launch-1.0 --version
gst-inspect-1.0 --gst-plugin-path=/mnt/gst/lib/gstreamer-1.0
如果能看到版本信息和插件列表,恭喜你,环境搭建成功了!
gst-launch-1.0报错“cannot open shared object file”。排查了半天,原来是LD_LIBRARY_PATH没设置对。记住,一定要包含/mnt/gst/lib,而且glib的库也要在这个路径下。
最后,跑个简单的测试:
gst-launch-1.0 videotestsrc ! autovideosink
如果屏幕出现彩条,说明你的Gstreamer已经能在目标板上正常工作了。嗯,这一步虽然简单,但成就感满满。
| 组件 | 版本建议 | 关键配置 |
|---|---|---|
| gstreamer | 1.20.x | --host=arm-linux-gnueabihf |
| glib | 2.72.x | --with-pcre=internal |
| orc | 0.4.33 | ORC_CFLAGS指定CPU |
| libffi | 3.4.4 | 默认配置即可 |
好了,环境搭建就到这里。下一章咱们开始写第一个Gstreamer插件,到时候你会觉得,今天这些折腾都是值得的。