之前arm-linux-cc 4.4.3 交叉编译gstreamer1.18博客里搞了一下Gstreamer的交叉编译,本来想试一下gstreamer移植到友善之臂2416开发板上的效果,奈何开发板资源不足,运行不起来。现在有了飞思卡尔的开发板,所以想试一下移植到这块开发板上的效果,移植过程记录如下。
1 交叉编译gstreamer
(1)拉取code,下载的gstreamer版本为1.18:
git clone https://gitlab.freedesktop.org/gstreamer/gst-build.git -b 1.18
进入到编译目录:
cd gst-build
(2)在gst-build目录下创建交叉编译配置文件cross_file.txt,文件中内容如下:
[properties]
pkg_config_libdir = ['/usr/local/complie_tool/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/lib/pkgconfig']
c_args = ['-std=gnu99', '-D_GNU_SOURCE']
[binaries]
c = 'arm-none-linux-gnueabi-gcc'
cpp = 'arm-none-linux-gnueabi-g++'
ar = 'arm-none-linux-gnueabi-ar'
strip = 'arm-none-linux-gnueabi-strip'
pkgconfig = 'pkg-config'
[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'ARMv9'
endian = 'little'
[build_machine]
system = 'linux'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'
其中pkg_config_libdir为交叉编译工具链pkgconfig路径。
(3)将gst-build/subprojects/glib/meson_options中libmount选项更改为false,否则编译前需要先编译libmount。
option('libmount',
type : 'boolean',
value : false,
description : 'build with libmount support')
(4)在gst-build目录执行meson 命令:
meson --prefix=/home/zhy/code/rIoTboard/gstreamer \
--cross-file cross_file.txt build/
运行成功后出现如下信息:
(5)执行以下命令,进行编译
ninja -C build
编译时出现了“undefined reference to `clock_gettime’”的错误:
subprojects/gst-plugins-good/sys/v4l2/libgstvideo4linux2.so.p/gstv4l2src.c.o: In function `gst_v4l2src_create':
/home/zhy/code/mypc/gstreamer/source_code/gst-build/build/../subprojects/gst-plugins-good/sys/v4l2/gstv4l2src.c:886: undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
网上查阅资料是缺少librt库导致的,因此在v4l2编译时增加librt依赖。首先在gst-build/subprojects/gst-plugins-good目录下的meson.build里增加以下代码,添加librt依赖,增加位置大概在90行左右。
syslibs = []
if not cc.has_function('clock_gettime')
librt = cc.find_library('rt', required: false)
if cc.has_function('clock_gettime', dependencies: librt)
syslibs += [librt]
endif
endif
然后在gst-build/subprojects/gst-plugins-good/sys/v4l2目录下meson.build里的dependencies添加syslibs依赖。
gstv4l2 = library('gstvideo4linux2',
v4l2_sources,
c_args : gst_plugins_good_args,
include_directories : [configinc, libsinc],
dependencies : [gstbase_dep, gstvideo_dep, gstallocators_dep, gudev_dep, libv4l2_dep, syslibs],
install : true,
install_dir : plugins_install_dir,
)
添加后gst-plugins-good可以编译通过,编译gst-plugins-bad时又出现了以下错误。
In file included from ../subprojects/gst-plugins-bad/tests/check/elements/avtpcrfbase.c:21:0:
../subprojects/gst-plugins-bad/tests/check/elements/../../../ext/avtp/gstavtpcrfbase.c: In function 'setup_socket':
../subprojects/gst-plugins-bad/tests/check/elements/../../../ext/avtp/gstavtpcrfbase.c:183:39: error: 'ETH_P_TSN' undeclared (first use in this function)
../subprojects/gst-plugins-bad/tests/check/elements/../../../ext/avtp/gstavtpcrfbase.c:183:39: note: each undeclared identifier is reported only once for each function it appears in
[3026/5558] Compiling C object subprojects/gst-plugins-bad/tests/check/elements_avtpcrfcheck.p/elements_avtpcrfcheck.c.o
该问题是编译avtp时的错误,原因还不明确,先不编译该模块,修改gst-plugins-bad目录下meson.build文件,将avtp设置为disabled。
option('avtp', type : 'feature', value : 'disabled', description : 'Audio/Video Transport Protocol (AVTP) plugin')
再执行编译命令后未遇到错误,编译成功后会有如下信息。
(6)编译成功后执行以下命令将编译好的gstreamer安装到之前指定的pefix目录。
meson install -C build
2 移植gstreamer
编译好后需要将之前pefix目录使用zip压缩时才能拷贝,因为安装的so创建了许多软链接,直接拷贝会报如下错误:
cp: cannot create symbolic link
因此需要使用zip 命令打包:
zip -r gstreamer.zip gstreamer
然后将整个压缩包拷贝到U盘或者SD卡。
启动开发板,在开发板当前路径创建code文件夹,并将SD卡中的gstreamer.zip复制到该目录,并解压:
mkdir code
cp -rf /media/mySDcard/gstreamer.zip /home/linaro/code
unzip /home/linaro/code/gstreamer.zip
开发板默认的用户是linaro。
运行gstreamer之前需要设置LD_LIBRARY_PATH和GST_PLUGIN_PATH_1_0 这两个环境变量,其中GST_PLUGIN_PATH_1_0是gstreamer plugin的路径。
LD_LIBRARY_PATH=/home/linaro/code/gstreamer/lib/:$LD_LIBRARY_PATH
GST_PLUGIN_PATH_1_0=/home/linaro/code/gstreamer/lib/gstreamer-1.0/
export LD_LIBRARY_PATH
export GST_PLUGIN_PATH_1_0
最后在gstreamer/bin目录下使用gst-play-1.0测试一下能否播放视频。
播放视频命令:
./gst-play-1.0 ../../media/movie1.mp4
运行后能看到解析出帧,但是没有显示画面,可以肯定的是移植成功了,后续找到问题再更新博客。