经过验证,确实可用。
缺点:实际上等于重新打开一次摄像头,大约需要3秒。
切换代码:
WyCameraCtx* pCamera = g_oStreamRtsp.pCamera; gst_element_unlink(pCamera->qtiqmmfsrc, g_oStreamRtsp.capsfilter); gst_element_set_state (pCamera->qtiqmmfsrc, GST_STATE_NULL); gst_bin_remove (GST_BIN (g_oWorkCtx.pipeline), pCamera->qtiqmmfsrc); pCamera->qtiqmmfsrc = NULL; pCamera->reference = 0; pCamera->getSrc(); gst_element_sync_state_with_parent (pCamera->getSrc()); gst_bin_add (GST_BIN (g_oWorkCtx.pipeline), pCamera->getSrcForLink()); int old_fps = fps[count%FPS_RANGE]; count ++; int new_fps = fps[count%FPS_RANGE]; WY_LOG_INFO("change fps count=%d, %d -> %d", count, old_fps, new_fps); set_capsfilter (g_oStreamRtsp.capsfilter, DEFAULT_WIDTH, DEFAULT_HEIGHT, new_fps); gst_element_link(pCamera->qtiqmmfsrc, g_oStreamRtsp.capsfilter); WY_LOG_TEXT("change fps OK");getSrc()
GstElement* getSrc() { if (reference == 0 && qtiqmmfsrc == NULL) { qtiqmmfsrc = gst_element_factory_make ("qtiqmmfsrc", qtiqmmfsrc_name); g_object_set (G_OBJECT (qtiqmmfsrc), "name", qmmf_name, NULL); g_object_set (G_OBJECT (qtiqmmfsrc), "camera", id, NULL); gst_bin_add (GST_BIN (pipeline), qtiqmmfsrc); } return qtiqmmfsrc; } GstElement* getSrcForLink() { reference++; WY_LOG_INT(reference); return getSrc(); }set_capsfilter
void set_capsfilter(GstElement* capsfilter, const int width, const int height, const int fps) { // Set caps GstCaps* caps = gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, "NV12", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, fps, 1, NULL); gst_caps_set_features (caps, 0, gst_caps_features_new ("memory:GBM", NULL)); g_object_set (G_OBJECT (capsfilter), "caps", caps, NULL); gst_caps_unref (caps); }