C#自动给达尔文视频服务器推流的实现方法

总体思路:
一、首先选择局域网内一台机器安装达尔文,可以在网上下载是开源的,英文名称:easyDarwin
二、根据摄像头品牌分别编写RTSP格式代码,不同的摄像头取流格式不一样,需要登录厂家网站索取。

Get方法请求网面,参数直接写在uri中,并且要地参数值部分编码,注意参数名

/// <summary>
       /// Get方法请求网面,参数直接写在uri中,并且要地参数值部分编码,注意参数名和“=”不能编码
       /// </summary>
       /// <param name="uri"></param>
       /// <returns></returns>
        public string Get(string uri)
        {
            try
            {
                //先根据⽤户请求的uri构造请求地址
                string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);
                //创建Web访问对象
                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
                //通过Web访问对象获取响应内容
                HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
                //通过响应内容流创建StreamReader对象,因为StreamReader更⾼级更快
                StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                //string returnXml = HttpUtility.UrlDecode(reader.ReadToEnd());//如果有编码问题就⽤这个⽅法
                string returnXml = reader.ReadToEnd();//利⽤StreamReader就可以从响应内容从头读到尾
                reader.Close();
                myResponse.Close();
                return returnXml;
            }catch(Exception ex){
                //throw ex;
                return ex.Message;
            }
        }

自动推流代码:

   /// <summary>
    /// 自动推流
    /// </summary>
    public void access_pushstream()
    {
        //管控平台自动推流,达尔文视频服务器地址:192.168.1.188:10008,使用其API接口,用HttpWebRequest和HttpWebResponse请求API接口,返回结果,
        //拉流地址:rtsp://192.168.1.188:554/live/myStream/192168147(最后面这个数字是ip地址的组合,这样比较好记,在前端页面可以直接访问)
        //url编码只能对参数值进行编码,参数名和“=”号不能编码,否则无法访问网页,还有就是@符号不能用%40,否则推流不成功!还有每个摄像头都会
        //有允许访问的最大连接数规定,超过此数量时,推流不成功,会返回一个:500
        while (true)
        {

            DataTable dt = SqlHelper.ExecuteDataTable("select * from crossing", new SqlParameter[] { });
            DataTable vedioServerIp_dt = SqlHelper.ExecuteDataTable("select * from vedioserverip", new SqlParameter[] { });
            string vedioServerIpStr = vedioServerIp_dt.Rows.Count == 1 ? vedioServerIp_dt.Rows[0]["vedioserverip"].ToString().Trim():"";
            
            
            if (vedioServerIpStr != "") {
                this.BaseUri = "http://" + vedioServerIpStr + ":10008";
                foreach (DataRow dr in dt.Rows)
                {
                    string ipstr = (string)dr["ip"].ToString().Trim();
                    string portstr = (string)dr["port"].ToString().Trim();

                    var configUrl = "http://" + ipstr + ":" + portstr + "/config";
                    var statusUrl = "http://" + ipstr + ":" + portstr + "/status";
                    bool[] ipstatus=GetIpStatus(ipstr, portstr);
                    if(!ipstatus[0]|| !ipstatus[1])
                    {
                        continue;
                    }

                    string configJsonString = GetWebserviceData(configUrl);
                   

                    if (configJsonString != "")
                    {
                        JObject config = JObject.Parse(configJsonString);
                     


                        for (var i = 0; i < 8; i++)
                        {
                            string codec = config["cameraArray"][i]["basic"]["codec"].ToString();//0:main_codec 1:sub_codec
                            string inputchannel = config["cameraArray"][i]["basic"]["inputchannel"].ToString();
                            string inputmode = config["cameraArray"][i]["basic"]["inputmode"].ToString();//0:CAM 1:NVR
                            string ip = config["cameraArray"][i]["basic"]["ip"].ToString();
                            string port = config["cameraArray"][i]["basic"]["port"].ToString();
                            int model = (int)(config["cameraArray"][i]["basic"]["model"]);//CAM_UNKNOWN,CAM_HK, CAM_DH, CAM_UV, CAM_WA, CAM_XLW, CAM_HW,CAM_TEST}TYPE_CAM
                           
                            string username = config["cameraArray"][i]["basic"]["username"].ToString();
                            string password = config["cameraArray"][i]["basic"]["password"].ToString();
                            string valid = config["cameraArray"][i]["basic"]["valid"].ToString();

                            string[] ipArray= ip.Split('.');
                            string ip_to_Str = ipArray[0].Trim() + ipArray[1].Trim() + ipArray[2].Trim() + ipArray[3].Trim();
                            string push_url = "/live/myStream/" + ip_to_Str;
                            string rtsp_url = "";
                            switch (model)
                            {
                                case (int)CAMTYPE.CAM_HK:
                                    {
                                        if (username != "" && password != "" && ip != "" && port != "" && codec != "" && inputmode != "" && inputchannel != "")
                                        {
                                            rtsp_url = mkUrlHK(username, password.Replace("%40","@"), ip, port, codec, inputmode, inputchannel);
                                            string uri_1 = "api/v1/stream/start?";
                                            string uri_2="url="+ HttpUtility.UrlEncode(rtsp_url,Encoding.UTF8);//url编码只能对参数值进行编码,参数名和“=”号不能编码,否则无法访问网页
                                            uri_2 += "&customPath="+ HttpUtility.UrlEncode(push_url, Encoding.UTF8); 
                                            uri_2 += "&transType=TCP&idelTimeout=100&heartbeatInterval=0";
                                            string uri_3 = uri_1 + uri_2;
                                            string result=Get(uri_3);//推流:成功返回200,已存在返回:400
                                        }
                                        break;
                                    }
                                case (int)CAMTYPE.CAM_DH:
                                    {
                                        if (username != "" && password != "" && ip != "" && port != "" && codec != "" && inputmode != "" && inputchannel != "")
                                        {
                                            rtsp_url = mkUrlDH(username, password, ip, port, codec, inputmode, inputchannel);
                                            string uri_1 = "api/v1/stream/start?";
                                            string uri_2 = "url=" + HttpUtility.UrlEncode(rtsp_url, Encoding.UTF8);
                                            uri_2 += "&customPath=" + HttpUtility.UrlEncode(push_url, Encoding.UTF8);
                                            uri_2 += "&transType=TCP&idelTimeout=100&heartbeatInterval=0";
                                            string uri_3 = uri_1 + uri_2;
                                            string result = Get(uri_3);//推流:成功返回200,已存在返回:400
                                        }
                                        break;
                                    }
                                case (int)CAMTYPE.CAM_UV:
                                    {
                                        if (username != "" && password != "" && ip != "" && port != "" && codec != "" && inputmode != "" && inputchannel != "")
                                        {
                                            rtsp_url = mkUrlUV(username, password, ip, port, codec, inputmode, inputchannel);
                                            string uri_1 = "api/v1/stream/start?";
                                            string uri_2 = "url=" + HttpUtility.UrlEncode(rtsp_url, Encoding.UTF8);
                                            uri_2 += "&customPath=" + HttpUtility.UrlEncode(push_url, Encoding.UTF8);
                                            uri_2 += "&transType=TCP&idelTimeout=100&heartbeatInterval=0";
                                            string uri_3 = uri_1 + uri_2;
                                            string result = Get(uri_3);//推流:成功返回200,已存在返回:400
                                        }
                                        break;
                                    }
                                case (int)CAMTYPE.CAM_WA:
                                    {
                                        if (username != "" && password != "" && ip != "" && port != "" && codec != "" && inputmode != "" && inputchannel != "")
                                        {
                                            rtsp_url = mkUrlWA(username, password, ip, port, codec, inputmode, inputchannel);
                                            string uri_1 = "api/v1/stream/start?";
                                            string uri_2 = "url=" + HttpUtility.UrlEncode(rtsp_url, Encoding.UTF8);
                                            uri_2 += "&customPath=" + HttpUtility.UrlEncode(push_url, Encoding.UTF8);
                                            uri_2 += "&transType=TCP&idelTimeout=100&heartbeatInterval=0";
                                            string uri_3 = uri_1 + uri_2;
                                            string result = Get(uri_3);//推流:成功返回200,已存在返回:400
                                        }
                                        break;
                                    }
                                case (int)CAMTYPE.CAM_XLW:
                                    {
                                        if (username != "" && password != "" && ip != "" && port != "" && codec != "" && inputmode != "" && inputchannel != "")
                                        {
                                            rtsp_url = mkUrlXLW(username, password, ip, port, codec, inputmode, inputchannel);
                                            string uri_1 = "api/v1/stream/start?";
                                            string uri_2 = "url=" + HttpUtility.UrlEncode(rtsp_url, Encoding.UTF8);
                                            uri_2 += "&customPath=" + HttpUtility.UrlEncode(push_url, Encoding.UTF8);
                                            uri_2 += "&transType=TCP&idelTimeout=100&heartbeatInterval=0";
                                            string uri_3 = uri_1 + uri_2;
                                            string result = Get(uri_3);//推流:成功返回200,已存在返回:400
                                        }
                                        break;
                                    }
                                case (int)CAMTYPE.CAM_HW:
                                    {
                                        if (username != "" && password != "" && ip != "" && port != "" && codec != "" && inputmode != "" && inputchannel != "")
                                        {
                                            rtsp_url = mkUrlHW(username, password, ip, port, codec, inputmode, inputchannel);
                                            string uri_1 = "api/v1/stream/start?";
                                            string uri_2 = "url=" + HttpUtility.UrlEncode(rtsp_url, Encoding.UTF8);
                                            uri_2 += "&customPath=" + HttpUtility.UrlEncode(push_url, Encoding.UTF8);
                                            uri_2 += "&transType=TCP&idelTimeout=100&heartbeatInterval=0";
                                            string uri_3 = uri_1 + uri_2;
                                            string result = Get(uri_3);//推流:成功返回200,已存在返回:400
                                        }
                                        break;
                                    }
                                case (int)CAMTYPE.CAM_TEST:
                                    {

                                        break;
                                    }
                            }
                        }
                    }
                }




            }

            Thread.Sleep(1000 * 60 * 60);//每隔一小时推一遍,推过的保留不会重复推流。

        }


    }

秋风写于淄博, 业务联系与技术交流:QQ375172665

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值