如何使用 onvif.org 从 ONVIF 摄像机获取流

Posted

技术标签:

【中文标题】如何使用 onvif.org 从 ONVIF 摄像机获取流【英文标题】:How to get stream from ONVIF camera using onvif.org 【发布时间】:2019-11-14 21:28:05 【问题描述】:

我已成功使用在以下 URL 中找到的代码:https://www.codeproject.com/Tips/1192709/ONVIF-PTZ-Control-in-Csharp

为了能够使用 ONVIF 协议平移/倾斜 IP 摄像机,如上所示 URL 使用:地址、命名空间http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl、OnvifMedia10http://onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl、 OnvifPTZService

由于这种类型的代码是非常新的,我很乐意帮助我如何从 IP 摄像机获取流。 (我现在正在使用软件查看流) 我还需要能够获取流,以便以后可以录制/拍摄快照。

我已经查看了此链接上的第 7.1 章,我正在尝试实现这一点:https://www.onvif.org/wp-content/uploads/2016/12/ONVIF_WG-APG-Application_Programmers_Guide-1.pdf

我想出了下面的代码。但奇怪的是这条线似乎把流放到了某种叫做“App”的播放器上。 “应用程序”未编译,想知道如何将此流放入某种播放器或控件?

App.DoStreaming(mediaUri.Uri);

 Streaming streaming;
        public class Streaming
        
            OnvifMedia10.StreamSetup streamSetup;
            OnvifMedia10.MediaUri mediaUri;
            OnvifMedia10.MediaClient mediaClient;
            String mediaProfileToken = "";
            String ErrorMessage = "";
            bool initialised = false;

            public bool Initialise(string cameraAddress, string userName, string password)
            
                bool result = false;
                try
                
                    var messageElement = new TextMessageEncodingBindingElement()
                    
                        MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
                    ;
                    HttpTransportBindingElement httpBinding = new HttpTransportBindingElement()
                    
                        AuthenticationScheme = AuthenticationSchemes.Digest
                    ;
                    CustomBinding bind = new CustomBinding(messageElement, httpBinding);
                    mediaClient = new OnvifMedia10.MediaClient(bind, new EndpointAddress($"http://cameraAddress/onvif/Media"));
                    mediaClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
                    mediaClient.ClientCredentials.HttpDigest.ClientCredential.UserName = userName;
                    mediaClient.ClientCredentials.HttpDigest.ClientCredential.Password = password;

                    var profs = mediaClient.GetProfiles();
                    mediaProfileToken = profs[0].token;

                    // setup stream configuration
                    streamSetup = new OnvifMedia10.StreamSetup();
                    streamSetup.Stream = OnvifMedia10.StreamType.RTPUnicast; //"RTP-Unicast";
                    streamSetup.Transport.Protocol = OnvifMedia10.TransportProtocol.UDP; //"UDP";

                    // RTP/RTSP/UDP is not a special tunnelling setup (is not requiring)!
                    streamSetup.Transport.Tunnel = null;

                    // get stream URI
                    mediaUri = new OnvifMedia10.MediaUri();
                    mediaUri = mediaClient.GetStreamUri(streamSetup, mediaProfileToken);
                    App.DoStreaming(mediaUri.Uri);



                    ErrorMessage = "";
                    result = initialised = true;
                
                catch (Exception ex)
                
                    ErrorMessage = ex.Message;
                
                return result;
            
        

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,您希望能够在您的App 中以您选择的控件查看流。

我建议你看看 Vlc.DotNet 包。

https://github.com/ZeBobo5/Vlc.DotNet

它使您可以将 vlc 播放器放在 c# windows 窗体中并在其上播放流/视频。

如果您使用的是 Visual Studio,您可以从 NuGet 包管理器获取此包以获得解决方案。您可以在Tools->NuGet Package Manager->Manage NuGet Packages for Solution... 下找到它。此 VLC.DotNet 包提供的 vlc 控件还允许您从视频中录制和拍摄快照。

这里有一个 wiki 链接,可帮助您开始使用 Vlc.DotNet 包进行开发。

https://github.com/ZeBobo5/Vlc.DotNet/wiki/Getting-started

【讨论】:

以上是关于如何使用 onvif.org 从 ONVIF 摄像机获取流的主要内容,如果未能解决你的问题,请参考以下文章

如何在onvif的官网上下载onvif的wsdl文件

尝试实现ONVIF服务器的SOAP Action不匹配

ONVIF设备管理器如何获取摄像机的密码摘要?

LiveNVR实现安防摄像头RTSP WEB无插件直播中ONVIF预制位接口的使用说明

虚拟ONVIF 摄像机

Onvif/RTSP网络安防摄像机网页无插件直播方案EasyNVR如何判断前端设备的类型?