十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何把摄像头画面推上网络?gst-rtsp-server的test-appsrc完整实战

如何把摄像头画面推上网络?gst-rtsp-server的test-appsrc完整实战 如何把摄像头画面推上网络gst-rtsp-server的test-appsrc完整实战【免费下载链接】gst-rtsp-serverRTSP server based on GStreamer. This module has been merged into the main GStreamer repo for further development.项目地址: https://gitcode.com/gh_mirrors/gs/gst-rtsp-server 想把摄像头画面推到网络上给别人看gst-rtsp-server基于 GStreamer 的 RTSP 流媒体服务器是最经典的方案之一。这篇文章带你完整走一遍官方示例test-appsrc理解它的整体结构、看懂appsrc推帧的关键套路最后把它改成推真实摄像头画面的实用模板全程附排查清单新手也能照着跑通。 一、环境准备安装依赖gst-rtsp-server 是一个构建在 GStreamer 之上的 C 语言库所有 RTSP 协议解析、RTP 打包、UDP/TCP 传输都复用 GStreamer 的基础设施核心源码在 gst/rtsp-server/ 目录约 1 万多行结构清晰易读。开始之前需要装好这些依赖以 Debian/Ubuntu 为例依赖用途gstreamer1.0及开发库多媒体框架核心gstreamer1.0-plugins-basevideoconvert、rtpbin等基础插件gstreamer1.0-plugins-goodvideotestsrc测试信号源gstreamer1.0-plugins-uglyx264enc编码器gstreamer1.0-toolsgst-launch-1.0/gst-inspect-1.0调试工具sudo apt install libgstreamer1.0-dev gstreamer1.0-plugins-base \ gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools然后把仓库克隆到本地项目主页地址https://gitcode.com/gh_mirrors/gs/gst-rtsp-servergit clone https://gitcode.com/gh_mirrors/gs/gst-rtsp-server 验证插件是否装齐gst-inspect-1.0 x264enc能正常输出信息就说明编码器可用。 二、先搞懂核心思路appsrc 是推流入口在讲代码之前先建立正确的心智模型服务器GstRTSPServer默认监听8554端口负责接收 RTSP 请求DESCRIBE / SETUP / PLAY。挂载点Mount Points把 URL 路径如/test映射到一个媒体工厂GstRTSPMediaFactory。媒体工厂用一行gst-launch风格的管线描述来创建流。关键点管线里必须有一个叫pay0的元素RTP 打包器有几路流就写pay0、pay1……当画面数据来自你的应用程序比如摄像头采集回调、解码后的帧时就在管线开头放一个appsrc——它就像一个待填充的空箱子你的代码通过need-data信号回调往里 push 视频帧GStreamer 负责编码、RTP 打包、发往所有客户端。这就是test-appsrc示例的全部精髓appsrc 占位 need-data 回调喂帧。 三、实战跑通官方 test-appsrc 示例官方示例文件examples/test-appsrc.c。我们按步骤拆解它的关键部分。1. 创建服务器并监听 8554 端口main函数里第一件事就是创建服务器实例见 examples/test-appsrc.cloop g_main_loop_new (NULL, FALSE); server gst_rtsp_server_new ();服务器默认监听 8554 端口也可以用service属性改端口。最后把它挂到主循环开始服务见 examples/test-appsrc.c并打印出流地址g_print (stream ready at rtsp://127.0.0.1:8554/test\n); g_main_loop_run (loop);2. 用 launch 管线定义流骨架创建媒体工厂并设置管线见 examples/test-appsrc.cfactory gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (factory, ( appsrc namemysrc ! videoconvert ! x264enc ! rtph264pay namepay0 pt96 ));注意管线里的三处命名约定namemysrc给appsrc起名后面回调里要靠这个名字找到它namepay0rtph264pay是 RTP 打包器名字必须以pay开头服务器据此识别这是一路流pt96动态负载类型号多路流时建议每路不同。然后把这个工厂挂载到/test这个 URL 上——之后客户端访问rtsp://ip:8554/test就会触发这条管线。3. 配置 appsrc 并连接 need-data 回调真正的喂帧逻辑在media-configure信号回调media_configure里见 examples/test-appsrc.c。每当有客户端请求、服务器创建新管线时这个回调就会被调用一次主要做三件事按名字找到 appsrcgst_bin_get_by_name_recurse_up (GST_BIN (element), mysrc)声明视频格式caps指定RGB16、分辨率 384×288并告诉 appsrc 使用time格式的时间戳连接need-data信号appsrc 需要数据时就会回调你你在回调里push-buffer塞入一帧。回调的喂帧逻辑非常直白见 examples/test-appsrc.c分配一块385×288×2字节的 buffer用memset填成纯黑或纯白交替切换打上时间戳然后推送GST_BUFFER_PTS (buffer) ctx-timestamp; GST_BUFFER_DURATION (buffer) gst_util_uint64_scale_int (1, GST_SECOND, 2); ctx-timestamp GST_BUFFER_DURATION (buffer); g_signal_emit_by_name (appsrc, push-buffer, buffer, ret);时间戳每 1/2 秒递增一次所以推出去的画面就是一张2 fps 的黑白闪烁测试图——这是示例故意做得最简的效果目的是验证整条链路通了。4. 编译并启动服务器gcc -o test-appsrc examples/test-appsrc.c \ $(pkg-config --cflags --libs gstreamer-1.0 gstreamer-rtsp-server-1.0) ./test-appsrc # stream ready at rtsp://127.0.0.1:8554/test5. 用播放器拉流验证另开一个终端任选一种方式# 方式一ffplay ffplay rtsp://127.0.0.1:8554/test # 方式二GStreamer 命令行 gst-launch-1.0 rtspsrc locationrtsp://127.0.0.1:8554/test latency100 ! \ decodebin ! videoconvert ! autovideosink # 方式三VLC # 媒体 → 打开网络串流 → 输入 rtsp://127.0.0.1:8554/test看到黑白画面交替闪烁恭喜你第一路 RTSP 流推上网络了 四、后台发生了什么一次完整的 RTSP 握手客户端ffplay/VLC打开地址后服务器内部依次发生这些事细节可参考官方文档 docs/READMEDESCRIBE客户端问有什么流服务器用工厂创建管线、preroll 后返回 SDP 描述SETUP协商传输方式UDP 双端口 或 TCP 互联服务器为每路流分配 UDP 端口PLAY开始把 RTP 数据发往客户端的端口同时把GstRTSPMedia置为 PLAYING播放期间客户端定期发 keep-alive超过 60 秒无活动会话被视为过期应用应定期调用gst_rtsp_session_pool_cleanup()回收资源默认会话池行为见 gst/rtsp-server/rtsp-session-pool.c。理解这条流程后很多看起来像网络问题的现象黑屏、卡住、端口不通就能对应到具体环节排查。 五、进阶把测试图换成真实摄像头画面现在把黑白闪烁图替换成真实画面只需要两步改动。1. 最简单直接用 v4l2src 替代 appsrc无应用层参与如果你的程序不需要逐帧处理比如只做转推可以完全不用appsrc改一行 launch 即可gst_rtsp_media_factory_set_launch (factory, ( v4l2src device/dev/video0 ! video/x-raw, width1280, height720, framerate30/1 ! videoconvert ! x264enc tunezerolatency speed-presetultrafast ! rtph264pay namepay0 pt96 ));v4l2src是 Linux 下访问 USB/网络摄像头V4L2 设备的标准元素记得给运行用户/dev/video0的读写权限。2. 更接近真实场景应用自己采集再经 appsrc 推送如果你的画面来自自己的采集/解码逻辑照抄test-appsrc的need-data模式即可但有两个关键要求帧率要真实示例的 0.5 帧/秒只够演示。真实视频请设置合理的framerate如 25/1 或 30/1并让时间戳按帧间隔递增编码器开低延迟直播场景务必加tunezerolatency音频类似地配低延迟参数否则会有 1~3 秒的缓冲延迟。另一个官方示例 examples/test-appsrc2.c 演示了音视频双路 独立生成管线的更完整形态它把生成管线和推流管线拆开need-data回调里直接从appsink拉帧再推给appsrc见 examples/test-appsrc2.c并处理了 PTS/DTS 从 0 开始的换算。把它作为真实项目改造的模板非常合适。 六、常见坑与排查清单现象可能原因排查方向客户端404 Not FoundURL 与挂载点不一致检查gst_rtsp_mount_points_add_factory挂载的路径no element x264enc报错缺 ugly 插件安装gstreamer1.0-plugins-ugly画面卡住不动时间戳不递增或 appsrc 没 push确认need-data回调里每次都更新了 PTS延迟很高秒级编码器默认参数缓冲大x264enc加tunezerolatency多个客户端访问摄像头卡死摄像头设备被独占工厂设置shared属性让多客户端共享同一条管线见 docs/README 中 more on GstRTSPMediaFactory 一节防火墙拦了流只放行 8554 端口UDP 模式还会用到一对动态端口跨网段建议协商 TCP 互联interleaved⚠️安全提醒官方文档明确说明服务器默认不做认证不建议直接暴露在公网。生产环境请实现GstRTSPAuth示例参考 examples/test-auth.c、examples/test-auth-digest.c。✅ 七、总结回顾一下这条摄像头画面上网的完整链路建服务器gst_rtsp_server_new() 挂主循环默认 8554 端口定管线launch 行里appsrc喂帧、编码器压缩、rtph264pay namepay0打包配回调media-configure里找到 appsrc、设 caps、连接need-data推帧验流ffplay / VLC 访问rtsp://ip:8554/test上生产换v4l2src或真实采集源、低延迟编码参数、共享管线、认证与安全。gst-rtsp-server 用不到 1 万行代码覆盖了 RTSP 服务器的全部核心逻辑appsrc这套模式更是应用层数据推流的通用范式——读懂test-appsrc这一个示例你就拥有了搭建自己 RTSP 流媒体服务的全部关键拼图。【免费下载链接】gst-rtsp-serverRTSP server based on GStreamer. This module has been merged into the main GStreamer repo for further development.项目地址: https://gitcode.com/gh_mirrors/gs/gst-rtsp-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表