使用Gstreamer提供RTSP流,寻找工作示例。

29

我们正在尝试在DM368 Leopardboard上使Gstreamer工作,我们已成功说服它创建一个测试视频(videotestsrc),对其进行编码并将其转储到文件中。

管道的工作方式如下:

gst-launch -v videotestsrc num-buffers=100 ! queue ! ffenc_mpeg4 bitrate=800000 ! ffmux_mp4 ! filesink location=video_test.mp4
下一步是修改管道以将测试卡流式传输到网络上,在使用像rtsp://ip_addr:port/streamname这样的方式在PC上使用VLC查看,但关于如何做到这一点的文档似乎非常稀少(而且经常过时),示例似乎混淆了源代码和命令行的方式。
我会自由地承认,问题中超过50%是我们对Gstreamer及其各个部分缺乏熟悉,我始终发现,如果我有一个可用的工作范例可以开始操作,那么我就可以插入棍子并从中解决其余问题。
我已经完成到这一步:
gst-launch -v videotestsrc ! queue ! ffenc_mpeg4 bitrate=800000 ! rtpmp4vpay ! tcpserversink host=<PC_ip> port=5000
似乎在VLC中使用 tcp://board_ip:port 后会发生某些事情,它似乎认为有些事情正在发生(不会抛出错误),但没有播放/显示任何内容。当我中断 (^C) gst 进程时,VLC 注意到了。
所以,基本上 - 任何指导/反馈都将很好,一个工作的一行代码将是非常棒的。
编辑补充:是的,我看到了 test_video.c 示例,但那是编译一个特殊的程序来执行某些看起来应该可以从命令行调用来证明概念的事情。
* = Linux version 2.6.32-17-ridgerun /CPU: ARM926EJ-S

2
这里有一个 C 语言的例子,看起来可以实现它,但并没有真正解释它的使用方法: http://cgit.freedesktop.org/gstreamer/gst-rtsp-server/tree/examples/test-video.c - John U
1
gst-rtsp-server有test-launch示例,您可以指定编码管道。由于它使用了大部分gstreamer的rtsp实现,因此服务器代码非常小。 - rajneesh
2
是的,我正在查看gst示例代码,但对我来说似乎应该有一些方法可以从命令行调用gstreamer来流式传输视频,以证明它的可行性和工作状态。 - John U
但是 RTSP 服务器使用哪个插件(元素)呢?它使用 udpsink 吗? - nirvanaswap
你能否将一个答案标记为正确答案? - Tik0
我投票关闭此问题,因为关于Linux及其应用程序的问题应该在https://unix.stackexchange.com/上提出。 - Rob
3个回答

33

来源: 与 RTP 不同的是,RTSP 服务器会根据需要协商 RTP 服务器和客户端之间的连接(链接)。gst-rtsp-server不是 gstreamer 插件,而是可用于实现自己的 RTSP 应用程序的库。以下测试用例在 Ubuntu 12.04.5 上应用:

  • 准备工作
    • 安装带有 base/good/ugly/bad 插件的 gstreamer-1.0
    • 安装 autoconf automake autopoint libtool 和其他缺失的必要构建工具
  • 构建 gst-rtsp-server
    • git clone git://anongit.freedesktop.org/gstreamer/gst-rtsp-server && cd gst-rtsp-server
    • 我们使用 gstreamer 1.2:git checkout remotes/origin/1.2
    • 构建:./autogen.sh --noconfigure && GST_PLUGINS_GOOD_DIR=$(pkg-config --variable=pluginsdir gstreamer-plugins-bad-1.0) ./configure && make(由于某些原因,GST_PLUGINS_GOOD_DIR 没有被 pkg-config 设置,我们需要显式设置它)
  • 测试运行
    • 运行测试应用程序:cd examples && ./test-launch "( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )"
  • 现在可以通过地址rtsp://HOST_IP:8554/test远程访问流了(例如使用VLC)。

  • 这是一个不错的开始,但我看到的主要问题是你最后一个项目“rtsp://HOST_IP:8554/test”实际上在“test-launch.c”中硬编码为127.0.0.1,因此它没有绑定到任何外部暴露的东西。 - Adam Plocher
    1
    不,完全不需要。只需将“HOST_IP”替换为运行应用程序“test-launch.c”的PC的IP或域名。然后从远程PC上运行诸如VLC之类的应用程序,您就可以看到测试源了。 - Tik0
    以上的测试启动非常好,我可以在VLC播放器上播放它。现在我想输入一个编码的网络直播流。我该如何更改输入源? - Satish Shetty
    对我来说,“test-mp4”在示例文件夹中可用,运行良好。请注意它不会提供任何控制台输出 - 只需继续测试:rtsp://HOST_IP:8554/test。 - Blaze
    我正在尝试理解,为什么要开发一个专用库?为什么 rtph265pay + udpsink 不够用呢? - CAMOBAP
    1
    @CAMOBAP,您提出的rtph265pay + udpsink方案是用于直接将RTP流发送到远端的专用UDP端口。RTSP服务器则在更高的层次上为多个客户端服务多媒体流。 RTSP协议(实际上是RTP + RTCP)用于与连接的客户端建立连接和会话。总之 - RTP + UDP是点对点的,而RTSP是点对多个客户端的。 - Bartek Zdanowski

    3

    最终在这里找到了一个可行的例子:

    GStreamer rtp stream to vlc

    但是它需要为VLC创建一个.SDP文件并指定IP地址,这不是我们想要的结果...但是嘿,这是一个开始!


    0

    2
    请在您的答案中总结相关部分,而不是链接到外部解决方案。 - TomTom101

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