总体思路:
一、首先选择局域网内一台机器安装达尔文,可以在网上下载是开源的,英文名称: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