【问题标题】:ONVIF api capture image in C#ONVIF api 在 C# 中捕获图像
【发布时间】:2015-12-23 03:01:30
【问题描述】:

我有一个 ONVIF 网络摄像机。

我想从相机捕获图像,以便我可以处理该图像并将其保存到文件系统。

我发现有一个 onvif api 提供了一个方法 GetSnapshotUri 应该为我提供图像快照:

http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl

我设法通过添加服务引用将这个 api 导入到 Visual Studio 中:

我如何构造一个客户端来从这个服务调用GetSnapshotUri

【问题讨论】:

    标签: c# visual-studio wsdl ip-camera onvif


    【解决方案1】:

    GetSnapshotUri 返回一个用于使用 HTTP get 下载图像的 uri。 所以理论上你只需要调用这个函数,并在这篇 Stackoverflow 文章中显示的函数中使用返回的 uri: https://stackoverflow.com/a/3615831/4815603

    【讨论】:

    • 我该如何调用 GetSnapshotUri?这是我的主要问题
    • 对不起,我没有使用它的经验,但也许这个开源项目会有所帮助:sourceforge.net/projects/onvifdm
    • 您是否使用了 media.wsdl 服务规范中的 MediaClient 类。
    【解决方案2】:

    所以,经过大量搜索后,我设法从相机中捕获了一张图像。

    第一个问题是我使用“添加服务引用->高级->添加Web引用”而不是直接在“添加服务引用”框中输入服务地址。

    这里,我添加了地址:http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl

    然后我可以使用 pepOS 在评论中正确指出的MediaClient 类,最终代码如下所示:

    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);
    

    然后可以在MediaUri.Uriaddress 找到图像的 uri

    【讨论】:

    • 这和我做的一样,效果很好。在我的项目中,我需要将此流保存到文件同时在屏幕上显示超过 2 个摄像机。我使用了 VLC .NET ActiveX 插件,它的工作非常不稳定,我没有找到任何其他严肃(和免费)的插件来做到这一点。在我看来,使用原始 API 比购买非常昂贵的 Ozeki SDK 要好得多 - 但您需要解决将播放器嵌入到您的应用程序中的问题。
    【解决方案3】:

    我在这里使用 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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2012-02-01
      • 2017-12-24
      • 2010-10-29
      相关资源
      最近更新 更多