1
This commit is contained in:
parent
53f496ca7e
commit
300c98e426
@ -197,7 +197,6 @@ void RTSPManager::on_media_created(GstRTSPMediaFactory *, GstRTSPMedia *media, g
|
|||||||
|
|
||||||
LOG_INFO(std::string("[RTSP] media-configure for camera: ") + cam_name);
|
LOG_INFO(std::string("[RTSP] media-configure for camera: ") + cam_name);
|
||||||
|
|
||||||
// 把 media 保存起来,方便后面 unmount
|
|
||||||
g_object_ref(media);
|
g_object_ref(media);
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(media_map_mutex);
|
std::lock_guard<std::mutex> lock(media_map_mutex);
|
||||||
@ -212,43 +211,18 @@ void RTSPManager::on_media_created(GstRTSPMediaFactory *, GstRTSPMedia *media, g
|
|||||||
(GClosureNotify)g_free,
|
(GClosureNotify)g_free,
|
||||||
(GConnectFlags)0);
|
(GConnectFlags)0);
|
||||||
|
|
||||||
// 获取底层 pipeline
|
|
||||||
GstElement *pipeline = gst_rtsp_media_get_element(media);
|
GstElement *pipeline = gst_rtsp_media_get_element(media);
|
||||||
if (!pipeline)
|
if (!pipeline)
|
||||||
{
|
{
|
||||||
LOG_ERROR(std::string("[RTSP] Pipeline is NULL for camera: ") + cam_name);
|
LOG_ERROR("[RTSP] Pipeline NULL for camera: " + std::string(cam_name));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ★★★ 关键:拿到 encoder 元素,强制打一发 IDR,保证 VLC 第一次连接就能拿到关键帧
|
LOG_INFO("[RTSP] Forcing pipeline reset to generate IDR");
|
||||||
GstElement *enc = gst_bin_get_by_name(GST_BIN(pipeline), "enc");
|
|
||||||
if (enc)
|
|
||||||
{
|
|
||||||
LOG_INFO(std::string("[RTSP] Forcing IDR for camera: ") + cam_name);
|
|
||||||
// 这里用和 launch 里同名的属性,确保 Rockchip mpph264enc 能识别
|
|
||||||
g_object_set(enc, "option-force-idr", TRUE, NULL);
|
|
||||||
// 如果你想更狠一点,也可以顺便再 set 一次 idr-interval
|
|
||||||
// g_object_set(enc, "option-idr-interval", cam.fps, NULL); // 这里需要你把 fps 传进来才行
|
|
||||||
|
|
||||||
gst_object_unref(enc);
|
gst_element_set_state(pipeline, GST_STATE_READY);
|
||||||
}
|
gst_element_set_state(pipeline, GST_STATE_PLAYING);
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_WARN(std::string("[RTSP] Encoder 'enc' not found in pipeline for camera: ") + cam_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 强制 pipeline 进入 PLAYING,避免停在 PAUSED/preroll
|
|
||||||
GstStateChangeReturn ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
|
|
||||||
if (ret == GST_STATE_CHANGE_FAILURE)
|
|
||||||
{
|
|
||||||
LOG_ERROR(std::string("[RTSP] Failed to set pipeline PLAYING for camera: ") + cam_name);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_INFO(std::string("[RTSP] Force pipeline PLAYING for camera: ") + cam_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
// gst_rtsp_media_get_element() 返回的是加过 ref 的对象,需要 unref 一次
|
|
||||||
gst_object_unref(pipeline);
|
gst_object_unref(pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user