GStreamer将rtp流传输到VLC

46

我在尝试使用GStreamer创建一个简单的rtp流,并将其显示在vlc上,但遇到了一些麻烦。

我已经安装了GStreamer 0.10.30和VLC 1.1.3。我的唯一要求是使用MPEG4或H.264编解码器。

目前,我可以通过以下简单的流程来流式传输GStreamer videotestsrc:

gst-launch videotestsrc ! ffenc_mpeg4 ! rtpmp4vpay ! udpsink host=127.0.0.1 port=5000

输出客户端接收流所需的“caps”:

/GstPipeline:pipeline0/GstUDPSink:udpsink0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, profile-level-id=(string)1, config=(string)000001b001000001b58913000001000000012000c48d8800f50a041e1463000001b24c61766335322e3132332e30, payload=(int)96, ssrc=(uint)365697461, clock-base=(uint)390754204, seqnum-base=(uint)10399

我也能使用以下管道显示流:

gst-launch udpsrc uri=udp://127.0.0.1:5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, profile-level-id=(string)1, config=(string)000001b001000001b58913000001000000012000c48d88007d0a041e1463000001b24c61766335322e3132332e30, payload=(int)96, ssrc=(uint)298758266, clock-base=(uint)3097828288, seqnum-base=(uint)63478" ! rtpmp4vdepay ! ffdec_mpeg4 ! autovideosink

但是当我尝试使用VLC接收流时:

vlc -vvv rtp://127.0.0.1:5000

我什么都没有得到...


问题:这个文件的路径在哪里?文件名是什么?你刚刚在gstreamer中编辑的是一个配置文件吗? - telesismedia_channel
payload=(int)96 的意思是什么? - tkarls
我怎么知道你的流媒体命令是否使用了这些设置/限制 "/GstPipeline:pipeline0/GstUDPSink:udpsink0.GstPad:sink: (...)"。你是从哪里获取这些信息的? - Robert
4
将来看到此信息的人:你可能会收到一个错误,说没有名为 ffenc_mpeg4 的元素。只需将 ffenc_mpeg4ffdec_mpeg4 替换为 avenc_mpeg4avdec_mpeg4 即可。请注意不要改变原意,使翻译更加通俗易懂。 - SSBakh
3个回答

49

我已经解决了这个问题,只需要像这样一个sdp文件:

v=0
m=video 5000 RTP/AVP 96
c=IN IP4 127.0.0.1
a=rtpmap:96 MP4V-ES/90000

使用选项 "send-config=true" 来配置 rtpmp4vpay 元素:

gst-launch videotestsrc ! ffenc_mpeg4 ! rtpmp4vpay send-config=true ! udpsink host=127.0.0.1 port=5000

然后,它可以被玩耍

vlc <filename>.sdp

我已经找到了编写任何编解码器的SDP文件的方法。请参见https://en.wikipedia.org/wiki/RTP_audio_video_profile,然后转到具有SDP语法示例的相应RFC链接。 - Alex Bezuglyi
这种行为值得多次点赞。这个问题对我来说非常相关,但如果没有自我回答,它就有点无用了。 - Einar Sundgren
4
使用gstreamer 1.0,命令应该是gst-launch videotestsrc ! ffenc_mpeg4 ! rtpmp4vpay config-interval=3 ! udpsink host=127.0.0.1 port=5000,其中config-interval=3表示每隔3秒发送一次配置数据。现在已经弃用了send-config - Einar Sundgren
如何为MJPEG流生成SDP文件?RFC2435似乎太大了。此外,“rtpjpegpay”没有像“send-config”这样的选项。 - beemaster
由于使用127.0.0.1不够清晰,我想提一下:在多台机器的环境中,这将导致您的客户端(如VLC等)打开一个入站端口(因此可能需要防火墙规则),并且流将发送到该端口。这种解决方案无法轻松地让多个VLC客户端连接到单个终端点。(这让我有点困惑)。 - Adam Plocher
显示剩余2条评论

27

如何在 Windows 上为 H264 和新的 GStreamer 进行设置

gst-launch-1.0 videotestsrc ! openh264enc ! rtph264pay config-interval=10 pt=96 ! udpsink host=127.0.0.1 port=5000

sdp 文件:

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

有关其他编解码器,请参见https://en.wikipedia.org/wiki/RTP_audio_video_profile和RFC链接中的相应SDP示例。


4
您输错了端口号,否则它是可以工作的 - 经过测试,但使用x264enc(在Linux上).. RFC的提示非常好。 - nayana
3
而在OSX中的等效命令为:gst-launch-1.0 videotestsrc ! vtenc_h264 ! rtph264pay config-interval=10 pt=96 ! udpsink host=127.0.0.1 port=5000(替换原来的 openh264enc)。 - Roy Shilkrot
在我的情况下,在Windows上在openh264enc之后添加h264parse是有效的; gst-launch-1.0 videotestsrc ! openh264enc ! h264parse ! rtph264pay config-interval=10 pt=96 ! udpsink host=127.0.0.1 port=5000 - WOOSEOK CHOI

3

对于一些人来说,只需要查看答案,而不是查看答案下面的评论。

对于 GStreamer 1.18.xxx 版本,ffenc_mpeg4 被重命名为 avenc_mpeg4(这让我很困惑)。因此,请尝试以下命令:

gst-launch-1.0 videotestsrc ! avenc_mpeg4 ! rtpmp4vpay config-interval=1 ! udpsink host=127.0.0.1 port=5000

关于 VLC,与 Dave 的回答相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接