保姆级教程:在Ubuntu 22.04上,用GStreamer RTSP Server搭建多路摄像头监控推流服务
保姆级教程在Ubuntu 22.04上用GStreamer RTSP Server搭建多路摄像头监控推流服务当需要为家庭安防或小型物联网项目搭建实时视频监控系统时GStreamer RTSP Server提供了一个轻量级且高效的解决方案。本教程将手把手带你完成从环境准备到多路流配置的全过程特别针对Ubuntu 22.04系统优化避开常见依赖问题和配置陷阱。1. 环境准备与依赖安装在开始之前确保你的Ubuntu 22.04系统已经更新到最新状态sudo apt update sudo apt upgrade -yGStreamer生态包含多个组件我们需要安装基础套件和开发工具sudo apt install -y \ libgstreamer1.0-dev \ libgstreamer-plugins-base1.0-dev \ libgstreamer-plugins-good1.0-dev \ gstreamer1.0-plugins-base \ gstreamer1.0-plugins-good \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-ugly \ gstreamer1.0-libav \ gstreamer1.0-tools对于硬件加速支持根据你的GPU类型选择安装Intel核显sudo apt install -y gstreamer1.0-vaapiNVIDIA显卡sudo apt install -y nvidia-v4l-utils gstreamer1.0-nvcodec提示如果后续步骤中出现插件缺失错误可以通过gst-inspect-1.0命令检查已安装插件列表。2. 编译安装RTSP Server组件Ubuntu官方仓库中的GStreamer RTSP Server版本可能较旧我们需要从源码编译最新版本# 安装编译依赖 sudo apt install -y meson ninja-build libglib2.0-dev # 下载源码 git clone https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server.git cd gst-rtsp-server # 配置编译选项 meson setup build \ --prefix/usr \ --libdirlib/x86_64-linux-gnu \ --buildtyperelease # 编译安装 ninja -C build sudo ninja -C build install验证安装是否成功pkg-config --modversion gstreamer-rtsp-server-1.0如果遇到动态库加载问题可以执行以下命令更新系统库缓存sudo ldconfig3. 摄像头设备配置与测试连接摄像头设备后首先确认系统是否正确识别v4l2-ctl --list-devices典型输出示例USB Camera (usb-0000:00:14.0-1): /dev/video0 /dev/video1 Integrated Camera (pci-0000:00:1f.4): /dev/video2测试单个摄像头的视频采集gst-launch-1.0 v4l2src device/dev/video0 ! videoconvert ! ximagesink如果出现画面卡顿或延迟可以调整采集参数gst-launch-1.0 v4l2src device/dev/video0 \ ! video/x-raw,width1280,height720,framerate30/1 \ ! videoconvert ! ximagesink4. 构建多路RTSP流媒体服务创建一个名为rtsp-server.c的源文件包含以下核心代码#include gst/gst.h #include gst/rtsp-server/rtsp-server.h #define DEFAULT_PORT 8554 #define DEFAULT_MOUNT_POINT /stream typedef struct { GstRTSPServer *server; GstRTSPMountPoints *mounts; int camera_count; char **camera_devices; } ServerContext; static gboolean cleanup_sessions(ServerContext *ctx) { GstRTSPSessionPool *pool gst_rtsp_server_get_session_pool(ctx-server); gst_rtsp_session_pool_cleanup(pool); g_object_unref(pool); return TRUE; } int main(int argc, char *argv[]) { if (argc 2) { g_printerr(Usage: %s video_device1 [video_device2 ...]\n, argv[0]); return -1; } ServerContext ctx { .camera_count argc - 1, .camera_devices argv 1 }; gst_init(argc, argv); GMainLoop *loop g_main_loop_new(NULL, FALSE); // 创建RTSP服务器实例 ctx.server gst_rtsp_server_new(); gst_rtsp_server_set_service(ctx.server, DEFAULT_PORT); // 获取挂载点配置 ctx.mounts gst_rtsp_server_get_mount_points(ctx.server); // 为每个摄像头创建媒体工厂 for (int i 0; i ctx.camera_count; i) { gchar *launch g_strdup_printf( ( v4l2src device%s ! videoconvert ! video/x-raw,width1280,height720,framerate30/1 ! x264enc speed-presetultrafast tunezerolatency ! rtph264pay namepay0 pt96 ), ctx.camera_devices[i]); GstRTSPMediaFactory *factory gst_rtsp_media_factory_new(); gst_rtsp_media_factory_set_launch(factory, launch); gst_rtsp_media_factory_set_shared(factory, TRUE); gchar *mount_path g_strdup_printf(%s%d, DEFAULT_MOUNT_POINT, i); gst_rtsp_mount_points_add_factory(ctx.mounts, mount_path, factory); g_free(launch); g_free(mount_path); g_object_unref(factory); } // 设置会话清理定时器 g_timeout_add_seconds(5, (GSourceFunc)cleanup_sessions, ctx); // 启动服务 gst_rtsp_server_attach(ctx.server, NULL); g_print(RTSP server running at rtsp://0.0.0.0:%s%s{0-%d}\n, DEFAULT_PORT, DEFAULT_MOUNT_POINT, ctx.camera_count - 1); g_main_loop_run(loop); // 清理资源 g_object_unref(ctx.mounts); g_object_unref(ctx.server); g_main_loop_unref(loop); gst_deinit(); return 0; }编译程序gcc rtsp-server.c -o rtsp-server \ pkg-config --cflags --libs gstreamer-rtsp-server-1.0 gstreamer-1.0启动服务假设有两个摄像头设备./rtsp-server /dev/video0 /dev/video15. 客户端连接与性能优化服务启动后可以通过以下方式测试各视频流使用VLC播放器打开网络串流rtsp://服务器IP:8554/stream0第二个摄像头rtsp://服务器IP:8554/stream1使用GStreamer命令行工具gst-launch-1.0 playbin urirtsp://localhost:8554/stream0对于性能优化可以考虑以下调整编码参数优化// 修改x264enc参数 x264enc speed-presetsuperfast tunezerolatency bitrate2048 ! 多线程处理// 在管道中添加队列和多线程元素 videoconvert ! queue max-size-buffers3 ! x264enc ...硬件加速Intel QSV加速vaapipostproc ! vaapih264enc ! rtph264pay ...NVIDIA NVENC加速nvvidconv ! nvh264enc ! rtph264pay ...网络传输优化// 启用UDP传输并设置缓冲区大小 gst_rtsp_media_factory_set_protocols(factory, GST_RTSP_LOWER_TRANS_UDP); gst_rtsp_media_factory_set_buffer_size(factory, 524288);6. 系统服务与自动重启配置为了确保服务稳定运行我们可以将其配置为系统服务创建/etc/systemd/system/rtsp-server.service文件[Unit] DescriptionMulti-camera RTSP Streaming Server Afternetwork.target [Service] Typesimple Userroot ExecStart/usr/local/bin/rtsp-server /dev/video0 /dev/video1 Restartalways RestartSec5 [Install] WantedBymulti-user.target启用并启动服务sudo systemctl daemon-reload sudo systemctl enable rtsp-server sudo systemctl start rtsp-server监控服务状态journalctl -u rtsp-server -f7. 高级功能扩展7.1 动态分辨率切换可以通过发送信号通知服务器重新加载配置// 在main函数中添加信号处理 signal(SIGUSR1, reload_config); void reload_config(int sig) { // 重新解析配置文件并更新管道 }7.2 移动侦测与事件触发结合GStreamer的movementdetect插件实现videoconvert ! movementdetect sensitivity0.5 ! fakesink syncfalse7.3 视频录制功能扩展管道添加文件保存功能tee namet ! queue ! x264enc ! mp4mux ! filesink locationrecording.mp4 t. ! queue ...7.4 身份验证支持启用RTSP服务器认证GstRTSPAuth *auth gst_rtsp_auth_new(); GstRTSPToken *token gst_rtsp_token_new(GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, gst_rtsp_token_parse_role(user)); gst_rtsp_auth_set_default_token(auth, token); gst_rtsp_server_set_auth(ctx.server, auth);