Bootstrap

RIoTBoard开发板系列笔记(三)—— 移植Gstreamer

之前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 

运行后能看到解析出帧,但是没有显示画面,可以肯定的是移植成功了,后续找到问题再更新博客。

在这里插入图片描述

;