ONVIF api capture image in C#

安稳与你 提交于 2019-12-08 04:55:07

问题


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




回答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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!