参考
- arm-linux交叉编译Gstreamer(重要)
- gstreamer移植qnx(四):交叉编译qnx版本的gstreamer插件库(重要)
- gstreamer交叉编译
- 关于linux:GStreamer上的“黑名单”是什么意思?
- gstreamer 环境变亮设置
- Gstreamer讲解
- 编译configure常用参数详解
- linux 源码编译 ./configure 的配置和用法
移植原因
开发中需要gstreamer
的shm
插件(共享内存),开发板中的没有这个插件,所以需要移植。
相关命令
file
: 查看文件详细信息,例如是否是ARM平台程序。举例:file xxx.so
ldd
: 查看依赖关系。举例:ldd xxx.so
注意事项
移植的过程比较曲折,资料也比较乱,趁还没忘记记录一下遇到的问题。能记多少记多少吧,下次遇到同样的问题少做点弯路。
- 我主要是参照arm-linux交叉编译Gstreamer这篇文章的步骤来的。严格按照文章的顺序和版本来。
版本很重要。版本很重要。版本很重要。
初学者还是用一样的版本吧。 - 我的交叉编译器:
aarch64-buildroot-linux-gnu-gcc
- 源码目录:
/home/alientek/gstreamer/gst-build/
- 安装目录:
/home/alientek/gstreamer/prefix/
- 导出交叉编译环境:
export PATH=$PATH:/opt/atk-dlrk356x-toolchain/bin
- gstreamer下载链接
- 其他链接库下载 (如果打不开换个浏览器试试,下载很快的)
编译zlib
//shell命令
cd /home/alientek/gstreamer/gst-build/
tar xf zlib-1.2.11.tar.xz
CC=aarch64-buildroot-linux-gnu-gcc ./configure --prefix=/home/alientek/gstreamer/prefix --enable-shared
make -j16 //-j16会快很多
make install
//卸载命令
make uninstall
//清除
make clean
make distclean //会删除Makefile文件,清除后需要重新./configure配置
编译libffi
没什么注意的,与参考文章步骤一致。根据自己的板子填写参数即可。
//下面两种情况拿不准可以试一下,没报错就行
CC=aarch64-buildroot-linux-gnu-gcc ./configure --prefix=/home/alientek/gstreamer/prefix --host=aarch64-buildroot-linux-gnu --enable-shared
./configure --prefix=/home/alientek/gstreamer/prefix CC=aarch64-buildroot-linux-gnu-gcc --host=aarch64-buildroot-linux-gnu --enable-shared
编译gettext
一致
编译glib
//我的配置命令
LIBFFI_CFLAGS='-I/home/alientek/gstreamer/prefix/lib/libffi-3.2.1/include' \
LIBFFI_LIBS='-lffi -L=/home/alientek/gstreamer/prefix/lib' \
ZLIB_CFLAGS='-I/home/alientek/gstreamer/prefix/include' \
ZLIB_LIBS='-lz -L/home/alientek/gstreamer/prefix/lib' \
./configure --host=aarch64-buildroot-linux-gnu --prefix=/home/alientek/gstreamer/prefix \
PKG_CONFIG_PATH=/home/alientek/gstreamer/prefix/lib/pkgconfig/ \
glib_cv_stack_grows=no glib_cv_uscore=yes \
ac_cv_func_posix_getpwuid_r=yes ac_cv_func_posix_getgrgid_r=yes \
--with-pcre=internal --enable-libmount=no
编译orc
一致
编译x264
//我的配置命令
./configure --prefix=/home/alientek/gstreamer/prefix \
--enable-shared --host=aarch64-buildroot-linux-gnu --disable-asm \
--cross-prefix=aarch64-buildroot-linux-gnu-
编译libxml
//我的配置命令
./configure --prefix=/home/alientek/gstreamer/prefix \
--enable-shared --host=aarch64-buildroot-linux-gnu \
CROSS_COMPILE=aarch64-buildroot-linux-gnu- --with-python=no \
Z_CFLAGS='-I/home/alientek/gstreamer/prefix/include' \
Z_LIBS='-lz -L/home/alientek/gstreamer/prefix/lib'
编译openssl
//我的配置命令
./config no-asm shared --prefix=/home/alientek/gstreamer/prefix \
CROSS_COMPILE=aarch64-buildroot-linux-gnu-
交叉编译Gstreamer
//我的配置命令
./configure --prefix=/home/alientek/gstreamer/prefix --host=aarch64-buildroot-linux-gnu \
LDFLAGS="-Wl,--unresolved-symbols=ignore-in-shared-libs -I/home/alientek/gstreamer/prefix/include" \
PKG_CONFIG_PATH=/home/alientek/gstreamer/prefix/lib/pkgconfig \
GIO_LIBS="-L/home/alientek/gstreamer/prefix/lib -lgio-2.0 -lgobject-2.0 -lglib-2.0" \
GLIB_LIBS="-L/home/alientek/gstreamer/prefix/lib -lglib-2.0 -lgobject-2.0 -lgthread-2.0 -lgmodule-2.0" \
--disable-loadsave --disable-gtk-doc --disable-valgrind \
ac_cv_func_register_printf_function=no
交叉编译其他插件
- 插件:gst-plugins-base、gst-plugins-good、gst-plugins-bad,gst-plugins-ugly-1.14.0.tar
- 如果提示X11找不到的致命错误,到Makefile中将X11关闭。(base库编译的时候遇到了)
//与编译gstreamer命令一样,我的配置命令
./configure --prefix=/home/alientek/gstreamer/prefix --host=aarch64-buildroot-linux-gnu \
LDFLAGS="-Wl,--unresolved-symbols=ignore-in-shared-libs -I/home/alientek/gstreamer/prefix/include" \
PKG_CONFIG_PATH=/home/alientek/gstreamer/prefix/lib/pkgconfig \
GIO_LIBS="-L/home/alientek/gstreamer/prefix/lib -lgio-2.0 -lgobject-2.0 -lglib-2.0" \
GLIB_LIBS="-L/home/alientek/gstreamer/prefix/lib -lglib-2.0 -lgobject-2.0 -lgthread-2.0 -lgmodule-2.0" \
--disable-loadsave --disable-gtk-doc --disable-valgrind \
ac_cv_func_register_printf_function=no
移植到开发板
- 将
prefix/lib
中libgst
前缀的文件都拷贝到开发板的/usr/lib
,注意链接问题,建议压缩后复制。 - 将
prefix/lib/gstreamer-1.0
文件夹中的文件都拷贝到开发板的/usr/lib/gstreamer-1.0
遇到的问题
- 按照上面的步骤移植后,
gst-inspect-1.0
命令查看只有一个插件(默认就有一个插件,所以就是移植的所有插件都不识别)。搞了半天没搞定,怀疑是版本引起的(开发板原来的gstreamer版本是1.20.0,移植的版本是1.14.0)。 - 试过的环境变量
//配置环境变量
export LD_LIBRARY_PATH=/usr/lib/:$LD_LIBRARY_PATH
export GST_PLUGIN_PATH_1_0=/usr/lib/gstreamer-1.0/
//出现了一个报错,之前报错也没有
(gst-inspect-1.0:1079): GStreamer-WARNING **: 08:13:44.024: External plugin loader failed. This most likely means that the plugin loader helper binary was not found or could not be run. You might need to set the GST_PLUGIN_SCANNER environment variable if your setup is unusual. This should normally not be required though.
//GST_PLUGIN_SCANNER环境变量
export GST_PLUGIN_SCANNER=/usr/libexec/gstreamer-1.0/gst-plugin-scanner
//删除黑名单后,gst-inspect-1.0能看到插件了,但是都在黑名单里
- 最后没办法,只把需要的
shm
(libgstshm.so
)插件复制到/usr/lib/gstreamer-1.0
目录下。(不同版本竟然能用,说明流程没错)
- 按照相同的方法复制
libgstx264.so
(ugly包中)被加入黑名单了。 - 删除黑名单文件:
rm /root/.cache/gstreamer-1.0/registry.aarch64.bin
总结
- 流程都走完了,虽然不太顺利。
- 中间遇到报错,有可能是ubuntu有些包没有安装,根据提示安装即可。