我计划使用 GStreamer 作为我的应用程序的新视频流库,但我想首先测试基本功能。不幸的是,存在文档问题,特别是:Windows 和 v1.x
我可以在 GStreamer 中播放本地视频文件。我可以在 GStreamer 中播放由 VLC 通过 UDP 或 RTP 流式传输的视频。我可以将 videotestsrc 从 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
很多行,很多关于上限格式的相互冲突的信息。
我已经尝试了很多大写组合,但到目前为止还没有任何效果。我尝试过的一个:
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)
为了能够从 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
听。
请随意根据您的需要进行修改。
我不能只发送 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
如果需要,请建议更改我不知道为什么接收命令不起作用。