问题
I have an ONVIF ip camera.
I want to to capture an image from the camera so that I can process that image and save it to the file system.
I found out that there is an onvif api which provides a method GetSnapshotUri
which should provide me with an image snapshot:
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
I managed to import this api in visual studio by adding a service reference to it:
How do I construct a client to call GetSnapshotUri
from this service?
回答1:
So, after lots of searching I managed to capture an image from the camera.
The first Problem was that I have used "Add Service Reference->Advanced->Add Web reference" instead of typing the service address directly in the "Add Service Reference" box.
Here, I added the address: http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
Then I could use the MediaClient
class, correctly pointed out by pepOS in a comment, and the final code looks like:
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);
The uri of the image could then be fount at the MediaUri.Uri
address
回答2:
The GetSnapshotUri returns a uri for downloading an image using HTTP get. So in theory you just need to call this function, and use the returned uri in the function shown in this Stackoverflow article: https://stackoverflow.com/a/3615831/4815603
回答3:
I am using onvif device manager dll here. To implement this method camera's IP, username and password must be known.
// 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;
}
}
来源:https://stackoverflow.com/questions/32779467/onvif-api-capture-image-in-c-sharp