首先,git clone下来:
git clone https://github.com/nickfox-taterli/a527-gstreamer1
要用VPU就要接受系统污染,内核使用BSP版本,因为目前这就是硬限制.除非你很有时间还拿到底层信息.我在Debian 13,要先安装各种包.
apt-get install -y meson ninja-build pkg-config python3-dev libglib2.0-dev flex bison libasound2-dev
我对版本记录了一下,毕竟gst其实是个复杂的系统,真的好多坑.
$ meson --version
1.7.0
$ ninja --version
1.12.1
$ gcc --version | head -1
gcc (Debian 14.2.0-19) 14.2.0
复制所有库到系统库文件夹,这些是全志闭源的,没办法,污染就污染了.
# 复制库文件(包括所有 .so 文件)
sudo cp blobs/*.so /lib/aarch64-linux-gnu/
# 更新库缓存
sudo ldconfig
然后开始编译核心
$ cd sources/gstreamer-1.20.1
$ meson setup builddir \
--prefix=/usr/local \
--libdir=lib \
--buildtype=release \
-Dtests=disabled -Dexamples=disabled -Dbenchmarks=disabled -Ddoc=disabled
正常会这样输出
gstreamer 1.20.1
Plugins : coreelements, coretracers
User defined options
benchmarks: disabled
buildtype : release
doc : disabled
examples : disabled
libdir : lib
prefix : /usr/local
tests : disabled
Found ninja-1.12.1 at /usr/bin/ninja
配置好就开始编译
$ ninja -C builddir -j4
$ sudo ninja -C builddir install
$ sudo ldconfig
安装完就能运行核心,不过这里没任何库,所以只输出版本号
$ gst-inspect-1.0 --version
gst-inspect-1.0 version 1.20.1
GStreamer 1.20.1
接下来编译插件,我这里不考虑接摄像头,所以V4L2先关闭,才能躲避全志ISP库(我连闭源文件都没找到)
# cd sources/gst-plugins-base-1.20.1
$ meson setup builddir \
--prefix=/usr/local \
--libdir=lib \
--buildtype=release \
-Dtests=disabled -Dexamples=disabled -Ddoc=disabled \
-Dgl=disabled -Dpango=disabled -Dogg=disabled -Dvorbis=disabled \
-Dalsa=enabled -Dx11=disabled -Dxvideo=disabled
$ cd sources/gst-plugins-good-1.20.1
$ meson setup builddir \
--prefix=/usr/local \
--libdir=lib \
--buildtype=release \
-Dtests=disabled -Dexamples=disabled -Ddoc=disabled \
-Dcairo=disabled -Dflac=disabled -Djpeg=disabled -Dpng=disabled \
-Dspeex=disabled -Dtaglib=disabled -Dvpx=disabled -Doss=disabled \
-Doss4=disabled -Dpulse=disabled -Dsoup=disabled -Dwaveform=disabled -Dv4l2=disabled
$ cd sources/gst-plugins-bad-1.20.1
$ meson setup builddir \
--prefix=/usr/local \
--libdir=lib \
--buildtype=release \
-Dtests=disabled -Dexamples=disabled -Ddoc=disabled \
-Dopencv=disabled -Dopenexr=disabled -Dopenh264=disabled -Dopenjpeg=disabled \
-Dfaad=disabled -Dfaac=disabled -Dfdkaac=disabled -Dsoundtouch=disabled \
-Dsbc=disabled -Dspandsp=disabled -Dsrtp=disabled -Dwebrtc=disabled \
-Dcurl=disabled -Dneon=disabled -Drtmp=disabled -Dsctp=disabled \
-Dsmoothstreaming=disabled -Ddash=disabled -Dhls=disabled \
-Dmsdk=disabled -Dva=disabled -Dwayland=disabled -Dx11=disabled
这几步都是gst自身,一般是不会出错的,最后编译omx以便获得硬件能力
$ cd sources/gst-omx-1.20.1
$ meson setup builddir \
--prefix=/usr/local \
--libdir=lib \
--buildtype=release \
-Dtarget=generic \
-Dtests=disabled -Dexamples=disabled -Ddoc=disabled
到这一步编译的工作完成了,开始写配置文件.
/etc/profile.d/gstreamer.sh
export LD_LIBRARY_PATH=/lib:/lib/aarch64-linux-gnu:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export GST_PLUGIN_PATH=/lib/gstreamer-1.0:/lib/aarch64-linux-gnu/gstreamer-1.0:/usr/local/lib/gstreamer-1.0
export XDG_CONFIG_DIRS=/etc/xdg:/etc/xdg
export GST_PLUGIN_SCANNER=/usr/local/libexec/gstreamer-1.0/gst-plugin-scanner
这些环境变量的作用是:
- LD_LIBRARY_PATH: 告诉系统在哪里找动态库
- GST_PLUGIN_PATH: 告诉GStreamer在哪里找插件
- XDG_CONFIG_DIRS: 告诉系统配置文件在哪里
- GST_PLUGIN_SCANNER: 指定GStreamer插件扫描器
然后配置OMX的配置文件 /etc/xdg/gstomx.conf
[omxh264videoenc]
type-name=GstOMXH264Enc
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.encoder.avc
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;video-framerate-integer;syncframe-flag-not-used;no-disable-outport
[omxmjpegvideoenc]
type-name=GstOMXMJPEGEnc
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.encoder.mjpeg
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;video-framerate-integer;syncframe-flag-not-used;no-disable-outport
[omxh264dec]
type-name=GstOMXH264Dec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.avc
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;event-port-settings-changed-port-0-to-1;no-disable-outport
[omxmjpegvideodec]
type-name=GstOMXMJPEGDec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.mjpeg
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;event-port-settings-changed-port-0-to-1;no-disable-outport
[omxmpeg2videodec]
type-name=GstOMXMPEG2VideoDec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.mpeg2
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;event-port-settings-changed-port-0-to-1;no-disable-outport
[omxmpeg1videodec]
type-name=GstOMXMPEG1Dec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.mpeg1
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;event-port-settings-changed-port-0-to-1;no-disable-outport
[omxmpeg4videodec]
type-name=GstOMXMPEG4VideoDec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.mpeg4
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;event-port-settings-changed-port-0-to-1;no-disable-outport
[omxh263videodec]
type-name=GstOMXH263Dec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.h263
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;event-port-settings-changed-port-0-to-1;no-disable-outport
[omxhevcvideodec]
type-name=GstOMXH265Dec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.hevc
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;video-framerate-integer;syncframe-flag-not-used;no-disable-outport
[omxvp8videodec]
type-name=GstOMXVP8Dec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.vp8
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;video-framerate-integer;syncframe-flag-not-used;no-disable-outport
[omxvp9videodec]
type-name=GstOMXVP9Dec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.vp9
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;video-framerate-integer;syncframe-flag-not-used;no-disable-outport
[omxavsvideodec]
type-name=GstOMXAVSDec
core-name=/lib/aarch64-linux-gnu/libOmxCore.so
component-name=OMX.allwinner.video.decoder.avs
rank=257
in-port-index=0
out-port-index=1
hacks=event-port-settings-changed-ndata-parameter-swap;event-port-settings-changed-port-0-to-1;no-disable-outport
这样,2个编码器H.264和MJPEG,11个解码器H.264,MJPEG,MPEG1,MPEG2,MPEG4,H.263,H.265,VP8,VP9,AVS全都配置上了.
最后全志的cedarc还有自己的配置.
/etc/cedarc.conf
[paramter]
vdecoder_save_bitstream = 0
vdecoder_save_bitstream_path = /data/camera/bs.dat
vdecoder_save_special_bitstream = 0
vdecoder_save_special_bitstream_path = /data/camera/spec.awsp
vdecoder_save_picture_en = 0
vdecoder_save_picture_start_num = 0
vdecoder_save_picture_total_num = 10
vdecoder_save_picture_path = /data/camera/pic.dat
vdecoder_show_speed_info = 0
vdecoder_printf_log = 0
vdecoder_fbm_printf_log = 0
vdecoder_sbm_printf_log = 0
ve_printf_register = 0
check_malloc_leak = 0
cdc_log_level = 5
vdec_log_level = 3
venc_log_level = 3
CedarC库日志级别讲解一下,其中2=VERBOSE, 3=DEBUG, 4=INFO, 5=WARNING, 6=ERROR.
功能验证
$ gst-inspect-1.0 | grep omx
omx: omxavsvideodec: OpenMAX AVS Video Decoder
omx: omxh263videodec: OpenMAX H.263 Video Decoder
omx: omxh264dec: OpenMAX H.264 Video Decoder
omx: omxh264videoenc: OpenMAX H.264 Video Encoder
omx: omxhevcvideodec: OpenMAX H.265 Video Decoder
omx: omxmjpegvideodec: OpenMAX MJPEG Video Decoder
omx: omxmjpegvideoenc: OpenMAX Mjpeg Video Encoder
omx: omxmpeg1videodec: OpenMAX MPEG1 Video Decoder
omx: omxmpeg2videodec: OpenMAX MPEG2 Video Decoder
omx: omxmpeg4videodec: OpenMAX MPEG4 Video Decoder
omx: omxvp8videodec: OpenMAX VP8 Video Decoder
omx: omxvp9videodec: OpenMAX VP9 Video Decoder
至于编解码测试这件事,你可以直接参考我GitHub项目上写的,就是标准的gst连接罢了.