Yocto OpenCV w/ GStreamer 安装问题
Yocto OpenCV w/ GStreamer installation issues
我有一个通过 OpenCV VideoWriter 实例化的简单 GStreamer 管道
LOG_INFO("Opening VP8 GStreamer writer object at "
<< host << ":" << port << " with " << horizontal_resolution
<< "x" << vertical_resolution << "p@" << fps << "fps"
<< "(color=" << is_color << ")");
const std::string filename{
" appsrc is-live=true ! videoconvert ! "
" vp8enc cpu-used=2 threads=2 min_quantizer=5 max_quantizer=5 deadline=100000 ! "
" rtpvp8pay ! application/x-rtp,media=video,encoding-name=VP8,payload=96 ! "
" udpsink host= " + host + " port= " + port
};
writer.open(
filename,
cv::CAP_GSTREAMER,
fps,
cv::Size{horizontal_resolution, vertical_resolution},
is_color
);
在我的主机上它 运行 很顺利,但是当我在目标上交叉编译和 运行 时,我得到以下信息:
Opening VP8 GStreamer writer object at 127.0.0.1:8004 with 160x120p@30fps(color=true)
0:00:00.003785000 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "appsrc"!
0:00:00.003901750 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "appsrc"
0:00:00.003951125 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "videoconvert"!
0:00:00.003972875 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "videoconvert"
0:00:00.003998375 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
0:00:00.004042250 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "vp8enc"!
0:00:00.004070875 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "vp8enc"
0:00:00.004105500 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
0:00:00.004135750 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "rtpvp8pay"!
0:00:00.004160250 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "rtpvp8pay"
0:00:00.004186875 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
0:00:00.004309875 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "udpsink"!
0:00:00.004336375 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "udpsink"
0:00:00.004364125 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
(EXE:3484): GStreamer-CRITICAL **: gst_debug_log_valist: assertion 'category != NULL' failed
** (EXE:3484): CRITICAL **: gst_app_src_end_of_stream: assertion 'GST_IS_APP_SRC (appsrc)' failed
我的 Yocto 配置文件如下,目标平台是 i.MX8M Mini。
require conf/distro/include/yocto-uninative.inc
MACHINE ??= "e0219"
UBOOT_CONFIG ??= "sd"
UBOOT_CONFIG[sd] ??= "e0219_config"
#MACHINE ??= 'imx8mmevk'
DISTRO ?= 'fsl-imx-xwayland'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS ??= "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
STOPTASKS,/tmp,100M,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K \
ABORT,/tmp,10M,1K"
PACKAGECONFIG_append_pn-qemu-native = " sdl"
PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl"
CONF_VERSION = "1"
DL_DIR ?= "${BSPDIR}/downloads/"
CORE_IMAGE_EXTRA_INSTALL += " net-tools iputils dhcpcd"
CORE_IMAGE_EXTRA_INSTALL += " openssh nano python3 ethtool i2c-tools strace spitools"
CORE_IMAGE_EXTRA_INSTALL += " tcpdump socat opencv libmicrohttpd libsrtp curl boost"
CORE_IMAGE_EXTRA_INSTALL += " nmap python-djangorestframework net-snmp"
CORE_IMAGE_EXTRA_INSTALL += " openmp llvm"
ACCEPT_FSL_EULA = "1"
如果我理解正确,opencv 配方应该需要 gstreamer 及其一些插件,但在我看来,在构建之后,GStreamer 无法找到 运行 管道所需的插件。这是 gst-inspect 的输出:
$ gst-inspect-1.0
coreelements: capsfilter: CapsFilter
coreelements: concat: Concat
coreelements: dataurisrc: data: URI source element
coreelements: downloadbuffer: DownloadBuffer
coreelements: fakesrc: Fake Source
coreelements: fakesink: Fake Sink
coreelements: fdsrc: Filedescriptor Source
coreelements: fdsink: Filedescriptor Sink
coreelements: filesrc: File Source
coreelements: funnel: Funnel pipe fitting
coreelements: identity: Identity
coreelements: input-selector: Input selector
coreelements: output-selector: Output selector
coreelements: queue: Queue
coreelements: queue2: Queue 2
coreelements: filesink: File Sink
coreelements: tee: Tee pipe fitting
coreelements: typefind: TypeFind
coreelements: multiqueue: MultiQueue
coreelements: valve: Valve element
coreelements: streamiddemux: Streamid Demux
staticelements: bin: Generic bin
staticelements: pipeline: Pipeline object
Total count: 2 plugins, 23 features
我该如何解决这个问题?
使用@Subrata 建议更新 2
我将@Subrata 建议的软件包添加到我的 local.conf 中,如下所示:
CORE_IMAGE_EXTRA_INSTALL += " gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav"
现在可以通过 gst-inspect 查看 179 个插件。
启动我的应用程序我仍然缺少一个元素,但这是朝着正确方向迈出的一步。
Opening VP8 GStreamer writer object at 127.0.0.1:8004 with 160x120p@30fps(color=true)
0:00:00.053317750 3520 0x16290b00 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "vp8enc"!
0:00:00.053537875 3520 0x16290b00 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "vp8enc"
0:00:00.053606125 3520 0x16290b00 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no sink [source=@0x16293290]
0:00:00.057937500 3520 0x16290b00 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@0x162a0250]
0:00:00.081852625 3520 0x1629f720 FIXME default gstutils.c:3981:gst_pad_create_stream_id_internal:<appsrc0:src> Creating random stream-id, consider implementing a deterministic way of creating a stream-id
尝试重新安装 gstreamer
软件包,例如 gstreamer1.0-plugins-good, gstreamer1.0-plugins-bad, gstreamer1.0-plugins-ugly
和 gstreamer1.0-libav
。
以下软件包将提供:gstreamer1.0-audiosink、gstreamer1.0-audiosource、gstreamer1.0-videosink、gstreamer1.0-videosource、gstreamer1.0-visualization
libav
具有用于编码 40 多种格式(MPEG、DivX、MPEG4、AC3、DV 等)的元素,用于解码 90 多种格式(AVI、MPEG、OGG、Matroska、ASF)的解码元素, ...).
完成@Subrata 的回答:
您需要安装gstreamer所需元素对应的包。
我不知道您使用的是哪个 Yocto 版本,但您可以看到 gstreamer 上默认安装了哪些 gstreamer 元素。在 meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc
文件中:
PACKAGECONFIG ??= " \
${GSTREAMER_ORC} \
${@bb.utils.filter('DISTRO_FEATURES', 'pulseaudio x11', d)} \
cairo flac gdk-pixbuf gudev jpeg libpng soup speex taglib v4l2 \
"
[...]
PACKAGECONFIG[vpx] = "--enable-vpx,--disable-vpx,libvpx"
现在需要 vp8enc
,包含在 vpx 库中,但是,如您所见,PACKAGECONFIG 变量不包含此选项。
您需要添加一个 .bbappend
文件并添加此选项才能使用此插件,在您的 meta 中:your-meta/repices-multimedia/gstreamer/gstreamer1.0-plugins-good_%.bbappend
PACKAGECONFIG_append=" vpx"
如果您打算编写需要此 vpx
元素的食谱,您可以将其添加到 RDEPENDS 中:
DEPENDS=" gstreamer1.0 gstreamer1.0-plugins-good"
RDEPENDS_${PN}=" gstreamer1.0 \
gstreamer1.0-plugins-good-vpx "
我有一个通过 OpenCV VideoWriter 实例化的简单 GStreamer 管道
LOG_INFO("Opening VP8 GStreamer writer object at "
<< host << ":" << port << " with " << horizontal_resolution
<< "x" << vertical_resolution << "p@" << fps << "fps"
<< "(color=" << is_color << ")");
const std::string filename{
" appsrc is-live=true ! videoconvert ! "
" vp8enc cpu-used=2 threads=2 min_quantizer=5 max_quantizer=5 deadline=100000 ! "
" rtpvp8pay ! application/x-rtp,media=video,encoding-name=VP8,payload=96 ! "
" udpsink host= " + host + " port= " + port
};
writer.open(
filename,
cv::CAP_GSTREAMER,
fps,
cv::Size{horizontal_resolution, vertical_resolution},
is_color
);
在我的主机上它 运行 很顺利,但是当我在目标上交叉编译和 运行 时,我得到以下信息:
Opening VP8 GStreamer writer object at 127.0.0.1:8004 with 160x120p@30fps(color=true)
0:00:00.003785000 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "appsrc"!
0:00:00.003901750 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "appsrc"
0:00:00.003951125 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "videoconvert"!
0:00:00.003972875 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "videoconvert"
0:00:00.003998375 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
0:00:00.004042250 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "vp8enc"!
0:00:00.004070875 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "vp8enc"
0:00:00.004105500 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
0:00:00.004135750 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "rtpvp8pay"!
0:00:00.004160250 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "rtpvp8pay"
0:00:00.004186875 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
0:00:00.004309875 3484 0xe7e0ac0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "udpsink"!
0:00:00.004336375 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "udpsink"
0:00:00.004364125 3484 0xe7e0ac0 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
(EXE:3484): GStreamer-CRITICAL **: gst_debug_log_valist: assertion 'category != NULL' failed
** (EXE:3484): CRITICAL **: gst_app_src_end_of_stream: assertion 'GST_IS_APP_SRC (appsrc)' failed
我的 Yocto 配置文件如下,目标平台是 i.MX8M Mini。
require conf/distro/include/yocto-uninative.inc
MACHINE ??= "e0219"
UBOOT_CONFIG ??= "sd"
UBOOT_CONFIG[sd] ??= "e0219_config"
#MACHINE ??= 'imx8mmevk'
DISTRO ?= 'fsl-imx-xwayland'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS ??= "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
STOPTASKS,/tmp,100M,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K \
ABORT,/tmp,10M,1K"
PACKAGECONFIG_append_pn-qemu-native = " sdl"
PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl"
CONF_VERSION = "1"
DL_DIR ?= "${BSPDIR}/downloads/"
CORE_IMAGE_EXTRA_INSTALL += " net-tools iputils dhcpcd"
CORE_IMAGE_EXTRA_INSTALL += " openssh nano python3 ethtool i2c-tools strace spitools"
CORE_IMAGE_EXTRA_INSTALL += " tcpdump socat opencv libmicrohttpd libsrtp curl boost"
CORE_IMAGE_EXTRA_INSTALL += " nmap python-djangorestframework net-snmp"
CORE_IMAGE_EXTRA_INSTALL += " openmp llvm"
ACCEPT_FSL_EULA = "1"
如果我理解正确,opencv 配方应该需要 gstreamer 及其一些插件,但在我看来,在构建之后,GStreamer 无法找到 运行 管道所需的插件。这是 gst-inspect 的输出:
$ gst-inspect-1.0
coreelements: capsfilter: CapsFilter
coreelements: concat: Concat
coreelements: dataurisrc: data: URI source element
coreelements: downloadbuffer: DownloadBuffer
coreelements: fakesrc: Fake Source
coreelements: fakesink: Fake Sink
coreelements: fdsrc: Filedescriptor Source
coreelements: fdsink: Filedescriptor Sink
coreelements: filesrc: File Source
coreelements: funnel: Funnel pipe fitting
coreelements: identity: Identity
coreelements: input-selector: Input selector
coreelements: output-selector: Output selector
coreelements: queue: Queue
coreelements: queue2: Queue 2
coreelements: filesink: File Sink
coreelements: tee: Tee pipe fitting
coreelements: typefind: TypeFind
coreelements: multiqueue: MultiQueue
coreelements: valve: Valve element
coreelements: streamiddemux: Streamid Demux
staticelements: bin: Generic bin
staticelements: pipeline: Pipeline object
Total count: 2 plugins, 23 features
我该如何解决这个问题?
使用@Subrata 建议更新 2
我将@Subrata 建议的软件包添加到我的 local.conf 中,如下所示:
CORE_IMAGE_EXTRA_INSTALL += " gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav"
现在可以通过 gst-inspect 查看 179 个插件。
启动我的应用程序我仍然缺少一个元素,但这是朝着正确方向迈出的一步。
Opening VP8 GStreamer writer object at 127.0.0.1:8004 with 160x120p@30fps(color=true)
0:00:00.053317750 3520 0x16290b00 WARN GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "vp8enc"!
0:00:00.053537875 3520 0x16290b00 ERROR GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "vp8enc"
0:00:00.053606125 3520 0x16290b00 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no sink [source=@0x16293290]
0:00:00.057937500 3520 0x16290b00 ERROR GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@0x162a0250]
0:00:00.081852625 3520 0x1629f720 FIXME default gstutils.c:3981:gst_pad_create_stream_id_internal:<appsrc0:src> Creating random stream-id, consider implementing a deterministic way of creating a stream-id
尝试重新安装 gstreamer
软件包,例如 gstreamer1.0-plugins-good, gstreamer1.0-plugins-bad, gstreamer1.0-plugins-ugly
和 gstreamer1.0-libav
。
以下软件包将提供:gstreamer1.0-audiosink、gstreamer1.0-audiosource、gstreamer1.0-videosink、gstreamer1.0-videosource、gstreamer1.0-visualization
libav
具有用于编码 40 多种格式(MPEG、DivX、MPEG4、AC3、DV 等)的元素,用于解码 90 多种格式(AVI、MPEG、OGG、Matroska、ASF)的解码元素, ...).
完成@Subrata 的回答: 您需要安装gstreamer所需元素对应的包。
我不知道您使用的是哪个 Yocto 版本,但您可以看到 gstreamer 上默认安装了哪些 gstreamer 元素。在 meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc
文件中:
PACKAGECONFIG ??= " \
${GSTREAMER_ORC} \
${@bb.utils.filter('DISTRO_FEATURES', 'pulseaudio x11', d)} \
cairo flac gdk-pixbuf gudev jpeg libpng soup speex taglib v4l2 \
"
[...]
PACKAGECONFIG[vpx] = "--enable-vpx,--disable-vpx,libvpx"
现在需要 vp8enc
,包含在 vpx 库中,但是,如您所见,PACKAGECONFIG 变量不包含此选项。
您需要添加一个 .bbappend
文件并添加此选项才能使用此插件,在您的 meta 中:your-meta/repices-multimedia/gstreamer/gstreamer1.0-plugins-good_%.bbappend
PACKAGECONFIG_append=" vpx"
如果您打算编写需要此 vpx
元素的食谱,您可以将其添加到 RDEPENDS 中:
DEPENDS=" gstreamer1.0 gstreamer1.0-plugins-good"
RDEPENDS_${PN}=" gstreamer1.0 \
gstreamer1.0-plugins-good-vpx "