微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Raspberry Pi 4B 上的 GStreamer RTSP 服务器管道

如何解决Raspberry Pi 4B 上的 GStreamer RTSP 服务器管道

我正在尝试为我的 RaspBerry Pi 4B 上的相机设置 RTSP 服务器。我安装了 GStreamer 和 libgstrtspserver-1.0-dev(版本 1.14.4),并使用了 test-launch.c 脚本,用 gcc test-launch.c -o test-launch $(pkg-config --cflags --libs gstreamer-1.0 gstreamer-rtsp-server-1.0)

编译

然后我尝试使用管道

./test-launch "v4l2src ! 'video/x-raw,width=1280,height=400,framerate=20/1,format=GRAY8' \
! videoconvert ! 'video/x-raw,format=I420' ! v4l2h264enc ! 'video/x-h264,stream-format=byte-stream,\
alignment=au' ! h264parse ! rtph264pay name=pay0 pt=96"

但是当我尝试从我的另一台计算机(通过 VLC 或 OpenCV)连接到它时,我在 Raspi 上收到了 GStreamer-CRITICAL 消息(我设置了 GST_DEBUG=4):

j@JRaspi:~/server $ ./test-launch "v4l2src device='/dev/video0' ! 'video/x-raw,format=GRAY8,framerate=20/1' ! videoconvert ! 'video/x-raw,alignment=au' ! h264parse ! rtph264pay name=pay0 pt=96"
stream ready at rtsp://127.0.0.1:8554/test

(test-launch:8246): GStreamer-CRITICAL **: 14:56:54.865: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' Failed

(test-launch:8246): GStreamer-CRITICAL **: 14:56:54.865: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' Failed

(test-launch:8246): GStreamer-CRITICAL **: 14:56:54.865: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' Failed

并且连接失败。

我可以确认

gst-launch-1.0 v4l2src ! 'video/x-raw,format=I420' ! autovideosink

我有用(可以很好地显示相机馈送),所以我想知道我的管道背面有什么问题,或者测试启动脚本是否由于某种原因在 RaspBerry Pi 上不起作用?

我的 Jetson Nano 上有一个类似的管道,运行良好:

./test-launch "v4l2src ! video/x-raw,format=GRAY8 \
! nvvidconv ! video/x-raw(memory:NVMM),format=(string)I420 ! omxh264enc ! video/x-h264,\
stream-format=byte-stream,alignment=au ! h264parse ! rtph264pay name=pay0 pt=96"

所以我有点不明白 RaspBerry Pi 出了什么问题。

编辑: 我做了一些进一步的测试,这条迂回的路线对我有用:

gst-launch-1.0 v4l2src ! 'video/x-raw,\
format=GRAY8' ! videoconvert ! 'video/x-raw,format=I420'\
! v4l2h264enc ! 'video/x-h264,alignment=au' \
! h264parse ! rtph264pay name=pay0 pt=96 ! rtph264depay ! h264parse \
! decodebin ! videoconvert ! autovideosink

所以我想知道测试启动和树莓派是否有问题?

编辑2: 所以我跑了G_DEBUG=fatal-criticals gdb -ex run --args test-launch "v4l2src ! 'video/x-raw,format=GRAY8' ! videoconvert ! 'video/x-raw,alignment=au' ! h264parse ! rtph264pay name=pay0 pt=96" 打印出来的:

Reading symbols from test-launch...(no debugging symbols found)...done.
Starting program: /home/joel/Arducam-Stereo-RPI/server/test-launch v4l2src\ \!\ \'video/x-raw,\ width=1280,\ height=400,\ format=GRAY8\'\ \!\ videoconvert\ \!\ \'video/x-raw,\ format=I420\'\ \!\ v4l2h264enc\ \!\ \'video/x-h264,\ stream-format=byte-stream,\ alignment=au\'\ \!\ h264parse\ \!\ rtph264pay\ name=pay0\ pt=96
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1".
stream ready at rtsp://127.0.0.1:8554/test
[New Thread 0xb657b3a0 (LWP 2529)]

(test-launch:2524): GStreamer-CRITICAL **: 16:46:07.769: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' Failed

(test-launch:2524): GStreamer-CRITICAL **: 16:46:07.787: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' Failed

(test-launch:2524): GStreamer-CRITICAL **: 16:46:07.788: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' Failed
[New Thread 0xb57743a0 (LWP 2530)]

(test-launch:2524): GStreamer-CRITICAL **: 16:46:27.960: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' Failed

(test-launch:2524): GStreamer-CRITICAL **: 16:46:27.960: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' Failed

(test-launch:2524): GStreamer-CRITICAL **: 16:46:27.960: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' Failed
[Thread 0xb57743a0 (LWP 2530) exited]
[Thread 0xb657b3a0 (LWP 2529) exited]
^C
Thread 1 "test-launch" received signal SIGINT,Interrupt.
__GI___poll (timeout=-1,nfds=2,fds=0x2e7e0)
--Type <RET> for more,q to quit,c to continue without paging--
    at ../sysdeps/unix/sysv/linux/poll.c:29
29  ../sysdeps/unix/sysv/linux/poll.c: No such file or directory.
(gdb) bt
#0  0xb6b4dcd0 in __GI___poll (timeout=-1,fds=0x2e7e0)
    at ../sysdeps/unix/sysv/linux/poll.c:29
#1  0xb6b4dcd0 in __GI___poll (fds=0x2e7e0,timeout=-1)
    at ../sysdeps/unix/sysv/linux/poll.c:26
#2  0xb6c45eb4 in  () at /usr/lib/arm-linux-gnueabihf/libglib-2.0.so.0
(gdb) 

所以我尝试了 sudo apt-get install --reinstall libglib2.0-0 但它没有改变任何东西

解决方法

管道中多余的单引号导致了问题。 所以一个工作管道是:

./test-launch "v4l2src ! video/x-raw,width=1280,height=400,format=GRAY8 \
! videoconvert ! video/x-raw,format=I420 ! v4l2h264enc ! video/x-h264,\ 
stream-format=byte-stream,alignment=au ! h264parse ! rtph264pay name=pay0 pt=96"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。