diff --git a/src/rtsp_manager.cpp b/src/rtsp_manager.cpp index cac6709..8310623 100644 --- a/src/rtsp_manager.cpp +++ b/src/rtsp_manager.cpp @@ -82,11 +82,11 @@ GstRTSPMediaFactory *RTSPManager::create_media_factory(const Camera &cam) std::string launch_str = "( v4l2src device=" + cam.device + " io-mode=2 is-live=true do-timestamp=true" + " ! identity sync=false" " ! " + caps + - " ! queue max-size-buffers=0 max-size-bytes=0 max-size-time=0" - " ! mpph264enc rc-mode=cbr" - " bps=" + + " ! queue leaky=downstream max-size-buffers=0 max-size-bytes=0 max-size-time=0" + " ! mpph264enc rc-mode=cbr bps=" + std::to_string(cam.bitrate) + " gop=" + std::to_string(cam.fps) + " header-mode=1" @@ -176,10 +176,25 @@ void RTSPManager::on_media_created(GstRTSPMediaFactory *, GstRTSPMedia *media, g media_map[cam_name].push_back(media); } - g_signal_connect_data(media, "unprepared", G_CALLBACK(on_media_unprepared), - g_strdup(cam_name), - (GClosureNotify)g_free, - (GConnectFlags)0); + g_signal_connect_data( + media, + "unprepared", + G_CALLBACK(on_media_unprepared), + g_strdup(cam_name), + (GClosureNotify)g_free, + (GConnectFlags)0); + + // ★★★ 关键补丁:阻止 preroll 卡死 v4l2 驱动,强制 PLAYING + GstElement *pipeline = gst_rtsp_media_get_element(media); + if (pipeline) + { + gst_element_set_state(pipeline, GST_STATE_PLAYING); + LOG_INFO(std::string("[RTSP] Force pipeline PLAYING for camera: ") + cam_name); + } + else + { + LOG_WARN(std::string("[RTSP] Pipeline is NULL for camera: ") + cam_name); + } } void RTSPManager::on_media_unprepared(GstRTSPMedia *media, gpointer user_data)