gst-rtsp-server实现的rtsp服务器自定义sdp

在使用gst-rtsp-server开发rtsp 服务器时,有时候在服务端收到DESCRIBE命令之后,返回给客户端的sdp,需要进行定制。

但是,gst-rtsp-server并没有在发送sdp给客户端之前,给上层应用更改sdp信息的接口。

怎么办呢?

我们先看看gst-rtsp-server的源码中,从收到客户端的命令请求,到最终发送出去sdp信息,到底是怎么做的。

下面以gst-rtsp-server-1.10.5版本为例,其它更高版本实现差异并不大。

源码中如何发送sdp

gst-rtsp-server监听以后,每一个客户端连接上来,会挂接一个GstRTSPClient。

对这个GstRtspClient的挂接过程如下:

guint  
gst_rtsp_client_attach (GstRTSPClient * client, GMainContext * context)  
{  
  GstRTSPClientPrivate *priv;  
  guint res;  
  
  g_return_val_if_fail (GST_IS_RTSP_CLIENT (client), 0);  
  priv = client->priv;  
  g_return_val_if_fail (priv->connection != NULL, 0);  
  g_return_val_if_fail (priv->watch == NULL, 0);  
  
  /* make sure noone will free the context before the watch is destroyed */  
  priv->watch_context = g_main_context_ref (context);  
  
  /* create watch for the connection and attach */  
  priv->watch = gst_rtsp_watch_new (priv->connection, &watch_funcs,  
      g_object_ref (client), (GDestroyNotify) client_watch_notify);  
  gst_rtsp_client_set_send_func (client, do_send_message, priv->watch,  
      (GDestroyNotify) gst_rtsp_watch_unref);  
  
  gst_rtsp_watch_set_send_backlog (priv->watch, 0, WATCH_BACKLOG_SIZE);  
  
  GST_INFO ("client %p: attaching to context %p", client, context);  
  res = gst_rtsp_watch_attach (priv->watch, context);  
  
  return res;  
}

我们看到,在这个GstRTSPClient的Connection上,加了一个回调函数结构watch_funcs。

watch_funcs

05-23
### RTSP流的使用方法与介绍 #### 一、RTSP协议简介 RTSP(Real-Time Streaming Protocol),即实时流传输协议,属于应用层协议,主要用于控制具有实时特性的数据传输。它允许客户端向服务器请求低延迟的数据传输,并使媒体播放器能够远程控制音视频流,类似于VCR遥控器的功能[^1]。 --- #### 二、常用工具及其操作方式 ##### 1. **GStreamer** GStreamer 是一个强大的多媒体框架,可以用来处理音频、视频和其他类型的媒体数据。以下是基于 GStreamer 的 RTSP 流发送和接收示例: - 发送 RTSP 流: ```bash gst-launch-1.0 v4l2src ! videoconvert ! x264enc ! rtph264pay config-interval=1 pt=96 ! udpsink host=<目标IP> port=<端口> ``` - 接收 RTSP 流: ```bash gst-launch-1.0 rtspsrc location=rtsp://<服务器IP>:<端口>/<路径> ! decodebin ! autovideosink ``` 以上命令分别展示了如何通过 GStreamer 实现 RTSP 流的发送与接收[^1]。 --- ##### 2. **FFmpeg** FFmpeg 是一个多用途的开源多媒体框架,广泛用于音视频转换和流媒体传输。以下是其基本用法: - 创建并推送 RTSP 流: ```bash ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://<服务器IP>:<端口>/<路径> ``` - 拉取 RTSP 流并保存为本地文件: ```bash ffmpeg -i rtsp://<服务器IP>:<端口>/<路径> -c copy output.mp4 ``` 这些命令可用于创建或拉取 RTSP 流,并将其存储为 MP4 文件。 --- ##### 3. **VLC** VLC 是一款跨平台的免费开源媒体播放器,支持多种协议和编码格式。可以通过以下方式进行 RTSP 流的操作: - 启动 RTSP 服务: ```bash raspivid -o - -t 0 | cvlc -v stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264 ``` 此命令适用于树莓派环境下的 RTSP 流生成[^3]。 - 打开 RTSP 流链接: 在 VLC 中打开网络串流选项,输入 `rtsp://<服务器IP>:<端口>/<路径>` 即可观看视频流。 --- ##### 4. **LiveGBS 平台** LiveGBS 是一种支持 GB/T 28181 和 RTSP 转发的流媒体服务平台。以下是配置 RTSP 输出的主要步骤: 1. 开启 RTSP 功能: 可以通过 Web 页面设置或修改 INI 配置文件来启用 RTSP 支持。 2. 设置用户名和密码: 在配置文件中指定访问权限所需的认证信息。 3. 获取 RTSP 地址: - 动态接口调用:通过 API 请求返回动态生成的 RTSP URL。 - 静态拼接:按照固定模板手动构建 RTSP 地址,例如 `rtsp://username:password@ip_address:port/path`[^2]。 --- #### 三、实际应用场景举例 假设需要在一个嵌入式设备(如树莓派)上部署摄像头监控系统并通过 RTSP 提供视频流,则可以采用以下方案: 1. 安装必要软件包: ```bash sudo apt-get update && sudo apt-get install vlc ffmpeg gstreamer1.0-tools ``` 2. 使用树莓派自带摄像头模块录制视频并将其实时推送到远端服务器: ```bash raspivid -o - -t 0 -w 640 -h 480 -fps 25 | cvlc -v stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/camera}' ``` 此时,在其他终端运行 VLC 或者 FFmpeg 来连接该 RTSP 地址即可查看实时画面[^3]。 --- #### 四、注意事项 - 确保防火墙已开放对应端口号以便外部设备能正常访问。 - 如果涉及高并发需求建议选用性能更优的服务端程序比如 Wowza Media Server 替代简单的脚本实现- 对于安全性较高的场景应考虑加密措施以及复杂的身份验证机制防止未授权访问[^1][^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值