From 389de678f9011450d99e2247080a9ed4099c2b6d Mon Sep 17 00:00:00 2001 From: cxh Date: Tue, 20 Jan 2026 14:14:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9live=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rtmp_manager.cpp | 55 +++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/src/rtmp_manager.cpp b/src/rtmp_manager.cpp index c58f96b..ca4649c 100644 --- a/src/rtmp_manager.cpp +++ b/src/rtmp_manager.cpp @@ -69,59 +69,46 @@ GstElement* RTMPManager::create_pipeline(const Camera& cam) const std::string stream = cam.name + "_main"; const std::string app = "camera"; - // live → 外网 const std::string live_rtmp = "rtmp://36.153.162.171:19435/" + app + "/" + stream + "?vhost=live"; - // record → 本地 SRS(录像) const std::string record_rtmp = "rtmp://127.0.0.1:2935/" + app + "/" + stream + "?vhost=record"; std::string pipeline_str = "v4l2src name=src device=" + cam.device + " io-mode=dmabuf " - - "! video/x-raw,format=NV12,width=1920,height=1080," - "framerate=" + + "! video/x-raw,format=NV12,width=1920,height=1080,framerate=" + std::to_string(cam.fps) + "/1 " - "! videoscale " "! video/x-raw,width=" + std::to_string(cam.width) + ",height=" + std::to_string(cam.height) + - " " - - "! queue max-size-buffers=2 max-size-time=0 leaky=downstream " - - "! mpph264enc rc-mode=cbr " - "bps=" + - std::to_string(cam.bitrate) + - " " - "gop=" + - std::to_string(cam.fps) + - " " - "header-mode=each-idr profile=baseline " - + " ! queue max-size-buffers=2 leaky=downstream " + "! mpph264enc rc-mode=cbr bps=" + + std::to_string(cam.bitrate) + " gop=" + std::to_string(cam.fps) + + " header-mode=each-idr profile=baseline " "! h264parse config-interval=1 " "! tee name=t " - // ===== record:永远开 ===== - "t. ! queue max-size-buffers=5 leaky=downstream " - "! flvmux streamable=true " - "! rtmpsink location=\"" + + // ========= 录像(永远启用)============ + "t. ! queue max-size-buffers=8 leaky=downstream " + "! flvmux name=rec_mux streamable=true " + "! rtmpsink name=rec_sink location=\"" + record_rtmp + - "\" sync=false async=false " + "\" sync=false async=false drop-on-latency=true " - // ===== live:valve 控制 ===== - "t. ! queue max-size-buffers=5 leaky=downstream " + // ========= live(valve 控制)=========== + "t. ! queue max-size-buffers=8 leaky=downstream " "! valve name=live_valve drop=true " - "! flvmux streamable=true " - "! rtmpsink location=\"" + - live_rtmp + "\" sync=false async=false"; + "! queue max-size-buffers=8 leaky=downstream " + "! flvmux name=live_mux streamable=true " + "! rtmpsink name=live_sink location=\"" + + live_rtmp + "\" sync=false async=false drop-on-latency=true "; - GError* error = nullptr; - GstElement* pipeline = gst_parse_launch(pipeline_str.c_str(), &error); - if (error) + GError* err = nullptr; + GstElement* pipeline = gst_parse_launch(pipeline_str.c_str(), &err); + if (err) { - LOG_ERROR("[RTMP] Pipeline creation failed: " + std::string(error->message)); - g_error_free(error); + LOG_ERROR("[RTMP] Pipeline creation failed: " + std::string(err->message)); + g_error_free(err); return nullptr; }