ONVIF api 在 C# 中捕获图像
ONVIF api capture image in C#
我有一个 ONVIF 网络摄像头。
我想从相机捕捉图像,以便我可以处理该图像并将其保存到文件系统。
我发现有一个 onvif api 它提供了一个方法 GetSnapshotUri
应该给我一个图像快照:
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
我通过向它添加服务引用设法将此 api 导入 visual studio:
我如何构造一个客户端来从该服务调用 GetSnapshotUri
?
GetSnapshotUri returns 用于使用 HTTP get 下载图像的 uri。
所以理论上你只需要调用这个函数,并在这篇 Whosebug 文章中显示的函数中使用返回的 uri:
所以,经过大量搜索,我设法从相机中捕获了图像。
第一个问题是我使用了 "Add Service Reference->Advanced->Add Web reference" 而不是直接在 "Add Service Reference" 框中键入服务地址。
在这里,我添加了地址:http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
然后我可以使用 MediaClient
class,pepOS 在评论中正确指出,最终代码如下:
var messageElement = new TextMessageEncodingBindingElement();
messageElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None);
HttpTransportBindingElement httpBinding = new HttpTransportBindingElement();
httpBinding.AuthenticationScheme = AuthenticationSchemes.Basic;
CustomBinding bind = new CustomBinding(messageElement, httpBinding);
EndpointAddress mediaAddress = new EndpointAddress("http://192.168.1.168:10001/onvif/Media");
MediaClient mediaClient = new MediaClient(bind, mediaAddress);
mediaClient.ClientCredentials.UserName.UserName = "admin";
mediaClient.ClientCredentials.UserName.Password = "admin";
Profile[] profiles = mediaClient.GetProfiles();
string profileToken = profiles[1].token;
MediaUri mediaUri = mediaClient.GetSnapshotUri(profileToken);
图像的 uri 可以在MediaUri.Uri
地址
我这里使用的是onvif设备管理器dll。要实现此方法,必须知道摄像机的 IP、用户名和密码。
// Onvif ODM
using onvif.services;
using odm.core;
using onvif.utils;
using utils;
public string GetSnapshotUrl()
{
try
{
string camera_ip = "http://" + camIp + "/onvif/device_service";
Uri Camuri = new Uri(camera_ip);
NvtSessionFactory sessionFactory = new NvtSessionFactory(account);
INvtSession session = sessionFactory.CreateSession(Camuri);
Profile[] Profiles = session.GetProfiles().RunSynchronously();
var snapshotlink = session.GetSnapshotUri(Profiles[0].token).RunSynchronously(); // taking snapshot on the first profile of the camera
return snapshotlink.uri;
}
catch (Exception ex)
{
return null;
}
}
我有一个 ONVIF 网络摄像头。
我想从相机捕捉图像,以便我可以处理该图像并将其保存到文件系统。
我发现有一个 onvif api 它提供了一个方法 GetSnapshotUri
应该给我一个图像快照:
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
我通过向它添加服务引用设法将此 api 导入 visual studio:
我如何构造一个客户端来从该服务调用 GetSnapshotUri
?
GetSnapshotUri returns 用于使用 HTTP get 下载图像的 uri。 所以理论上你只需要调用这个函数,并在这篇 Whosebug 文章中显示的函数中使用返回的 uri:
所以,经过大量搜索,我设法从相机中捕获了图像。
第一个问题是我使用了 "Add Service Reference->Advanced->Add Web reference" 而不是直接在 "Add Service Reference" 框中键入服务地址。
在这里,我添加了地址:http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
然后我可以使用 MediaClient
class,pepOS 在评论中正确指出,最终代码如下:
var messageElement = new TextMessageEncodingBindingElement();
messageElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None);
HttpTransportBindingElement httpBinding = new HttpTransportBindingElement();
httpBinding.AuthenticationScheme = AuthenticationSchemes.Basic;
CustomBinding bind = new CustomBinding(messageElement, httpBinding);
EndpointAddress mediaAddress = new EndpointAddress("http://192.168.1.168:10001/onvif/Media");
MediaClient mediaClient = new MediaClient(bind, mediaAddress);
mediaClient.ClientCredentials.UserName.UserName = "admin";
mediaClient.ClientCredentials.UserName.Password = "admin";
Profile[] profiles = mediaClient.GetProfiles();
string profileToken = profiles[1].token;
MediaUri mediaUri = mediaClient.GetSnapshotUri(profileToken);
图像的 uri 可以在MediaUri.Uri
地址
我这里使用的是onvif设备管理器dll。要实现此方法,必须知道摄像机的 IP、用户名和密码。
// Onvif ODM
using onvif.services;
using odm.core;
using onvif.utils;
using utils;
public string GetSnapshotUrl()
{
try
{
string camera_ip = "http://" + camIp + "/onvif/device_service";
Uri Camuri = new Uri(camera_ip);
NvtSessionFactory sessionFactory = new NvtSessionFactory(account);
INvtSession session = sessionFactory.CreateSession(Camuri);
Profile[] Profiles = session.GetProfiles().RunSynchronously();
var snapshotlink = session.GetSnapshotUri(Profiles[0].token).RunSynchronously(); // taking snapshot on the first profile of the camera
return snapshotlink.uri;
}
catch (Exception ex)
{
return null;
}
}