如何通过 UDP 将视频从 GStreamer 1.0 流式传输到 VLC

问题描述 投票:0回答:2

我计划使用 GStreamer 作为我的应用程序的新视频流库,但我想首先测试基本功能。不幸的是,存在文档问题,特别是:Windows 和 v1.x

我可以在 GStreamer 中播放本地视频文件。我可以在 GStreamer 中播放由 VLC 通过 UDP 或 RTP 流式传输的视频。我可以将 videotestsrc 从 GStreamer 流式传输到 VLC。

我无法将本地保存的视频从 GStreamer 流式传输到 VLC。我该怎么做?

视频格式.mp4

VLC版本3.0.4

Gstreamer版本1.16


(一些)经过测试的命令

gst-launch-1.0 filesrc location=C:/Users/me/Desktop/big_buck_bunny.mp4 ! queue ! udpsink port=1234 
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:00.027096112
gst-launch-1.0 filesrc location=C:/Users/me/Desktop/big_buck_bunny.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink port=1234

New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:00.027096112

之前的命令没有出现明显的错误,但 VLC 没有收到任何信息,Wireshark 也没有看到任何信息

gst-launch-1.0 -v filesrc location=C:/Users/me/Desktop/big_buck_bunny.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink port=1234

很多行,很多关于上限格式的相互冲突的信息。

Pastebin 输出

我已经尝试了很多大写组合,但到目前为止还没有任何效果。我尝试过的一个:

gst-launch-1.0 -v filesrc location=C:/Users/1137824/Desktop/big_buck_bunny.mp4 ! videoconvert ! videoscale ! video/x-raw,width=800,height=600 ! avenc_mpeg4 ! rtpmp4vpay config-interval=3 ! udpsink port=1234
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GstFileSrc:filesrc0: Internal data stream error.
Additional debug info:
../libs/gst/base/gstbasesrc.c(3072): gst_base_src_loop (): /GstPipeline:pipeline0/GstFileSrc:filesrc0:
streaming stopped, reason not-negotiated (-4)
ERROR: pipeline doesn't want to preroll.

尝试从 VLC 流式传输到 Gstreamer 再到 VLC(认为 GStreamer 可能是在一个数据包中发送整个视频,而不是逐帧发送)

gst-launch-1.0 udpsrc port=1234 ! rtph264pay ! udpsink port=1212

ERROR: from element /GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0: GStreamer error: negotiation problem.
Additional debug info:
../gst-libs/gst/rtp/gstrtpbasepayload.c(714): gst_rtp_base_payload_chain (): /GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0:
No input format was negotiated, i.e. no caps event was received. Perhaps you need a parser or typefind element before the payloader

gst-launch-1.0 udpsrc port=1234 ! videoconvert ! x264enc ! rtph264pay ! udpsink port=1212

ERROR: from element /GstPipeline:pipeline0/GstUDPSrc:udpsrc0: Internal data stream error.
Additional debug info:
../libs/gst/base/gstbasesrc.c(3072): gst_base_src_loop (): /GstPipeline:pipeline0/GstUDPSrc:udpsrc0:
streaming stopped, reason not-negotiated (-4)
udp video-streaming gstreamer vlc gstreamer-1.0
2个回答
2
投票

为了能够从 VLC 接收数据,您需要从

rtph264pay
元素传输您的配置。这是通过元素的
config-interval
值来完成的。例如:

gst-launch-1.0 filesrc location=C:/Users/me/Desktop/big_buck_bunny.mp4 ! decodebin ! x264enc ! rtph264pay config-interval=1 pt=96 ! udpsink port=1234

对于接收方。 VLC需要一个

.sdp
文件来描述网络流。您可以使用文本编辑器创建一个简单的文本文件,并将内容写入该文件。示例 sdp 文件如下所示:

v=0
m=video 1234 RTP/AVP 96
c=IN IP4 127.0.0.1
a=rtpmap:96 H264/90000

在这里,向 VLC 描述您将从端口

H264
接收到
1234
视频流,它位于
RTP
数据包中,负载为
96
。你告诉它从
IP4
==
127.0.0.1
听。

请随意根据您的需要进行修改。


0
投票

我不能只发送 udp 流而不是通过 rtp 发送吗?

所有尝试过的命令在vlc中接收直播流 udp://@127.0.0.1:5602, udp://127.0.0.1:5602, udp://@:5602, udp://@0.0.0.0:5602, udp://0.0.0.0:5602,

发送命令:- gst-launch-1.0 -v v4l2src device=/dev/video0 !视频转换! x264enc 调整 = 零延迟比特率 = 500 ! h264解析! udpsink主机=127.0.0.1端口=5602

如果需要,请建议更改我不知道为什么接收命令不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.