gstreamer 1.14.5多个rtspsrc元件管道,通过'断开连接时重新连接各个流;C';代码

gstreamer 1.14.5多个rtspsrc元件管道,通过'断开连接时重新连接各个流;C';代码,c,rtsp,gstreamer-1.0,reconnect,C,Rtsp,Gstreamer 1.0,Reconnect,你好,GStreamer社区和粉丝们 我有一个工作管道,使用聚合到单个管道中的多个rtspsrc元素连接到多个H.264 IP摄像机流,用于下游视频处理 间歇性和随机地,来自远程和较慢连接的流将出现问题、超时、重试和死机,在查看流后处理时,该流将留下黑色图像。其他工作流继续正常处理。rtspsrc元素被设置为重试rtsp连接,这似乎在某种程度上起到了作用,但当它不起作用时,我正在寻找一种方法来完全断开流与rtspsrc元素的连接,并在不中断其他流的情况下重新启动该特定流 我还没有找到任何明显的例

你好,GStreamer社区和粉丝们

我有一个工作管道,使用聚合到单个管道中的多个rtspsrc元素连接到多个H.264 IP摄像机流,用于下游视频处理

间歇性和随机地,来自远程和较慢连接的流将出现问题、超时、重试和死机,在查看流后处理时,该流将留下黑色图像。其他工作流继续正常处理。rtspsrc元素被设置为重试rtsp连接,这似乎在某种程度上起到了作用,但当它不起作用时,我正在寻找一种方法来完全断开流与rtspsrc元素的连接,并在不中断其他流的情况下重新启动该特定流

我还没有找到任何明显的例子或方法来实现这一点,所以我一直在使用这个公共函数来访问处理连接的rtspsrc内部,对rtspsrc元素代码本身进行修补

__attribute__ ((visibility ("default"))) GstRTSPResult my_gst_rtspsrc_conninfo_reconnect(GstRTSPSrc *, gboolean);

GstRTSPResult
my_gst_rtspsrc_conninfo_reconnect(GstRTSPSrc *src, gboolean async)
{
    int retries = 0, port = 0;
    char portrange_buff[32];
    // gboolean manual_http;

    GST_ELEMENT_WARNING(src, RESOURCE, READ, (NULL),
            (">>>>>>>>>> Streamer: A camera closed the streaming connection.  Trying to reconnect"));

    gst_rtspsrc_set_state (src, GST_STATE_PAUSED);
    gst_rtspsrc_set_state (src, GST_STATE_READY);
    gst_rtspsrc_flush(src, TRUE, FALSE);
    // manual_http = src->conninfo.connection->manual_http;
    // src->conninfo.connection->manual_http = TRUE;
    gst_rtsp_connection_set_http_mode(src->conninfo.connection, TRUE);
    if (gst_rtsp_conninfo_close(src, &src->conninfo, TRUE) == GST_RTSP_OK)
    {
        memset(portrange_buff, 0, sizeof(portrange_buff));
        g_object_get(G_OBJECT(src), "port-range", portrange_buff, NULL);
        for (retries = 0; portrange_buff[retries] && isdigit(portrange_buff[retries]); retries++)
            port = (port * 10) + ((int)(portrange_buff[retries]) + 48);

        if (port != src->client_port_range.min)
            GST_ELEMENT_WARNING(src, RESOURCE, READ, (NULL), (">>>>>>>>>> Streamer: port range start mismatch"));
        GST_WARNING_OBJECT(src, ">>>>>>>>>> Streamer: old port.min: %d, old port.max: %d, old port-range: %s\n", (src->client_port_range.min), (src->client_port_range.max), (portrange_buff));
        src->client_port_range.min += 6;
        src->client_port_range.max += 6;
        src->next_port_num = src->client_port_range.min;

        memset(portrange_buff, 0, sizeof(portrange_buff));
        sprintf(portrange_buff, "%d-%d", src->client_port_range.min, src->client_port_range.max);
        g_object_set(G_OBJECT(src), "port-range", portrange_buff, NULL);

        for (retries = 0; retries < 5 && gst_rtsp_conninfo_connect(src, &src->conninfo, async) != GST_RTSP_OK; retries++)
            sleep(10);
    }

    if (retries < 5)
    {
        gst_rtspsrc_set_state(src, GST_STATE_PAUSED);
        gst_rtspsrc_set_state(src, GST_STATE_PLAYING);
        return GST_RTSP_OK;
    }
    else return GST_RTSP_ERROR;
}
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性((可见性(“默认”))GstRTSPResult my\u gst\u rtspsrc\u conninfo\u reconnect(GstRTSPSrc*,gboolean);
GstRTSPResult
我的\u gst\u rtspsrc\u conninfo\u重新连接(GstRTSPSrc*src,gboolean异步)
{
int重试次数=0,端口=0;
char portrange_buff[32];
//gboolean手册\u http;
GST\u元素\u警告(src,资源,读取,(空),
(“>>>>>>>>拖缆:摄像头关闭了流连接。正在尝试重新连接”);
gst\u rtspsrc\u设置\u状态(src,gst\u状态\u暂停);
gst_rtspsrc_设置_状态(src、gst_状态_就绪);
gst_rtspsrc_flush(src,TRUE,FALSE);
//手动\u http=src->conninfo.connection->手动\u http;
//src->conninfo.connection->manual\u http=TRUE;
gst\u rtsp\u连接\u设置\u http\u模式(src->conninfo.connection,TRUE);
如果(gst\U rtsp\U conninfo\U close(src,&src->conninfo,TRUE)==gst\U rtsp\U OK)
{
memset(portrange_buff,0,sizeof(portrange_buff));
g_object_get(g_object(src),“端口范围”,端口范围_buff,NULL);
对于(重试次数=0;端口范围缓冲[重试]&&isdigit(端口范围缓冲[重试]);重试次数++)
端口=(端口*10)+(int)(端口范围_buff[retries])+48);
如果(端口!=src->client\u port\u range.min)
GST_元素_警告(src,资源,读取,(NULL),(“>>>>>>>>>>>>拖缆:端口范围开始不匹配”);
GST_警告_对象(src,“>>>>>>>>>>>>拖缆:旧端口最小值:%d,旧端口最大值:%d,旧端口范围:%s\n”,(src->client_port_range.min),(src->client_port_range.max),(portrange_buff));
src->client\u port\u range.min+=6;
src->client\u port\u range.max+=6;
src->next\u port\u num=src->client\u port\u range.min;
memset(portrange_buff,0,sizeof(portrange_buff));
sprintf(portrange\u buff,“%d-%d”,src->client\u port\u range.min,src->client\u port\u range.max);
g_对象_集(g_对象(src),“端口范围”,端口范围_buff,NULL);
对于(重试次数=0;重试次数<5&&gst\u rtsp\u conninfo\u connect(src,&src->conninfo,async)!=gst\u rtsp\u确定;重试次数++)
睡眠(10);
}
如果(重试次数<5次)
{
gst\u rtspsrc\u设置\u状态(src,gst\u状态\u暂停);
gst_rtspsrc_设置_状态(src、gst_状态_播放);
返回GST\u RTSP\u OK;
}
否则返回GST\U RTSP\U错误;
}
我意识到这可能不是最佳实践,我这样做是为了在通过这次学习体验更好地了解内部情况后找到更好的方法

我感谢任何人对这个问题的反馈

-道格