【问题标题】:streaming video into a gstreamer rtsp server将视频流式传输到 gstreamer rtsp 服务器
【发布时间】:2017-11-03 12:47:50
【问题描述】:

我正在尝试构建一个基于 gstreamer 的 rtsp 视频服务器。 在我的情况下,我需要客户端连接到服务器并开始将视频流式传输到服务器。

我已经阅读了一些关于这个主题的教程,尤其是这个:http://www.ip-sense.com/linuxsense/how-to-develop-a-rtsp-server-in-linux-using-gstreamer/

在本教程中,视频是从服务器流式传输到客户端的,我需要对其进行更改,以便视频将从客户端流式传输到服务器。

编辑: 在演示中,这个管道被启动:

gst_rtsp_media_factory_set_launch (factory, "( "
          "videotestsrc ! video/x-raw-yuv,width=320,height=240,framerate=10/1 ! "
          "x264enc ! queue ! rtph264pay name=pay0 pt=96 ! audiotestsrc ! audio/x-raw-int,rate=8000 ! alawenc ! rtppcmapay name=pay1 pt=97 "")");

管道从视频和音频测试源开始,并将它们编码为有效负载 0 和 1。我需要做相反的事情 - 获取 rtsp 有效负载并对其进行解码。

【问题讨论】:

  • 谢谢,我什么都没试过,因为我不知道该尝试什么。

标签: video-streaming gstreamer rtsp


【解决方案1】:

虽然这个问题是很久以前提出的,但我会为可能正在寻找它的其他人回答。使用 GStreamer 来实现这一点。

  1. Gstreamer 现在有一个 RTSP 媒体服务器Here
  2. Gstreamer 还有一个GstRtspClientSink element,它允许您将流发送到兼容的 RTSP 媒体服务器。一个基本的命令行示例是“gst-launch-1.0 videotestsrc!queue!x264enc!rtspclientsink location=rtsp://127.0.0.1:8554/test”,假设媒体服务器在本地主机上运行,​​端口 8554 并期待一个发布点“测试”
  3. 提供了一个基于 GStreamer RTSP 服务器的应用程序示例,该应用程序接受来自客户端的流Here

【讨论】:

  • 谢谢。但是,关于test-record.c,当客户端连接并开始向服务器发送流时会发生什么?有没有更完整的例子来说明我们如何利用传入的流?
  • 考虑到 test-record.c,一旦客户端开始将流发送到服务器,您可以使用 gst-launch-1.0 rtspsrc location=rtsp://127.0.0.1/test 播放流!解码器!自动视频接收器。也可以使用vlc来播放流
  • 我试过“gst-launch-1.0 videotestsrc!queue!x264enc!rtspclientsink location=rtsp://127.0.0.1:8554/test”但失败了,消息显示“错误:来自元素/GstPipeline:pipeline0/GstRTSPClientSink:rtspclientsink0:无法打开资源进行读写。附加调试信息:gstrtspclientsink.c(3207):gst_rtsp_client_sink_connect_to_server ():/GstPipeline:pipeline0/GstRTSPClientSink:rtspclientsink0:连接失败。(一般错误) 错误:管道不想预卷。"
【解决方案2】:

要解码客户端从服务器接收到的 RTSP 流,请使用 rtspsrc

    gst-launch rtspsrc location=${LOCATION} \
           ! rtph264depay ! ffdec_h264 ! ffmpegcolorspace ! xvimagesink

但您的问题似乎是针对将有效负载推送到服务器,而不是从服务器中提取它(至少在您编辑它之前......现在我有点不清楚)。

gstrtspserver 框架似乎针对 RTSP 的常见用例:客户端从服务器提取数据。 如果你想恢复它,你最好的开始可能是将 gstrtspserver 库破解为gstrtsppushclient 框架(只需交换连接逻辑就可以了)。 您还必须重新实现接收(服务器)端。

但它不再是真正的 RTSP(从某种意义上说,你不会找到任何其他可以处理你的应用程序)。

您或许应该重新考虑您的架构。 一个好的开始阅读可能是RFC2326

【讨论】:

    【解决方案3】:

    如果您真正想要的是一个从“客户端”接收流式输入的“服务器”,只需颠倒服务器和客户端应用程序的角色即可。编写一个始终存在的客户端您可能需要某种重新启动循环,以便如果传入流的结尾结束您的管道,您只需重新启动它。此外,您的客户需要对数据做任何您想做的事情;存储它,展示它,重播它(???)。

    现在可以修改客户端(以前是服务器)代码以将数据发送到服务器(以前是客户端),然后终止或等待另一个流传输。

    有点笨拙,但它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2012-10-02
      • 2019-01-26
      相关资源
      最近更新 更多