Search code examples
c#visual-studiowsdlip-cameraonvif

ONVIF api capture image in C#


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?


Solution

  • 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