我已经成功使用了在以下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,OnvifMedia10
http://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”没有编译,不知道如何将这种流传递给某种播放器或控件?
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;
}
}