背景:
我最近开展了一个项目,使用此处的软件包让 DJI Tello 视频流与飞行控制一起工作:https://github.com/Alexander89/rust-tello/tree/master
我对包做了一些小的更改,最相关的是我将在视频端口 (11111) 上收到的所有数据包转发到本地主机上的端口 5000。
然后我使用此命令来处理视频并显示它:
gst-launch-1.0 -v udpsrc port=5000 caps="video/x-h264, stream-format=(string)byte-stream, width=(int)960, height=(int)720, framerate=(fraction)24/1, skip-first-bytes=2" ! queue ! decodebin ! videoconvert ! autovideosink sync=false
但是这是我这样做时注意到的行为:
看起来只渲染了框架的顶部,或者框架的一部分渲染在顶部,其余部分只是绿色或真正像素化(-_- 代表框架的一部分,===是绿色)。而且画面渲染部分的质量也会时时发生变化,有时很清晰,有时又很块(可以参考图片)。
-_-_-_-_-_-
==========
我看过其他处理一些类似问题的帖子(从 Tello 无人机到 RTP 的 Gstreamer UDP 流),这就是我能够走到这一步的原因,总的来说,我很好奇是否有人可以指出我的正确方向需要改变什么的方向。
如果我可以提供任何其他背景信息,请告诉我,谢谢!
所以我尝试了我认为使用 ffmpeg 的等效命令:
ffmpeg -i udp://127.0.0.1:5000 -vcodec libx264 output.mp4
,我发现 output.mp4 与我们使用 gst-launch 命令看到的几乎相同,除了未处理的部分图像的只是重复处理的图像部分的最后一行像素。
我还尝试了另一个使用 gst-launch 的命令:
`gst-launch-1.0 -v udpsrc port=5000 caps="video/x-h264, stream-format=(string)byte-stream, width=(int)960, height=(int)720, framerate=(fraction)24/1, skip-first-bytes=2" ! queue ! h264parse ! rtph264pay config-interval=1 `
,但这最终出错了。
您可能缺少第一个管道中的
h264parse
元素。应该是这样的
gst-launch-1.0 -v udpsrc port=5000 caps="video/x-h264, stream-format=(string)byte-stream, width=(int)960, height=(int)720, framerate=(fraction)24/1, skip-first-bytes=2" ! h264parse ! queue ! decodebin ! videoconvert ! autovideosink sync=false
您尝试的最后一个管道,在使用
rtph264pay
添加有效负载后,流无处可去,您需要将其传递到udpsink以创建UDP流
gst-launch-1.0 -v udpsrc port=5000 caps="video/x-h264, stream-format=(string)byte-stream, width=(int)960, height=(int)720, framerate=(fraction)24/1, skip-first-bytes=2" ! queue ! h264parse ! rtph264pay config-interval=1 ! udpsink host=x.x.x.x port=5004
然后使用
访问主机上的流gst-launch-1.0 rtpbin name=rtpbin udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" port=5004 ! rtpbin.recv_rtp_sink_0 rtpbin. ! queue ! rtpjitterbuffer mode=0 drop-on-latency=false latency=200 ! rtph264depay ! decodebin ! videoconvert ! autovideosink