ONVIF api capture image in C#

Pinte Dani picture Pinte Dani · Sep 25, 2015 · Viewed 14.5k times · Source

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:

enter image description here

How do I construct a client to call GetSnapshotUri from this service?

Answer

Pinte Dani picture Pinte Dani · Sep 29, 2015

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.Uriaddress