C#实现ONVIF摄像头监控与VLC视频播放集成指南

概述 在工业自动化、安防监控等领域,ONVIF协议已成为网络摄像头通信的标准协议。本文将介绍如何使用C#和VLC库实现ONVIF摄像头的连接、视频流播放和截图功能。 环境准备 在开始之前,需要准备以下组件:

1.  Visual Studio (2017或更高版本)  

2.  VLC播放器 (安装到系统)  

3.  Vlc.DotNet.Forms NuGet包  

4.  ONVIF WSDL服务引用   核心代码解析

添加服务器引用

vlc控件显示图像

1. 1.ONVIF摄像头初始化

  public bool Init(string ip, string port, string account, string password, VlcControl vlcControl)
{
    // 首先ping摄像头检查连通性
    Ping ping = new Ping();
    PingReply reply = ping.Send(ip);
    if (reply.Status != IPStatus.Success) {
        return false;
    }
    
    // 初始化参数
    _VlcControl = vlcControl;
    Account = account;
    PassWord = password;
    
    // 创建ONVIF设备连接
    deviceUri = new UriBuilder("http://10.1.20.81/onvif/device_service");
    deviceUri.Host = ip;
    
    // 配置绑定和认证
    HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
    httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Digest;
    binding = new CustomBinding(new TextMessageEncodingBindingElement(MessageVersion.Soap12WSAddressing10, Encoding.UTF8), httpTransport);
    
    try
    {
        // 连接设备并获取媒体服务
        DeviceClient device = new DeviceClient(binding, new EndpointAddress(deviceUri.ToString()));
        Service[] services = device.GetServices(false);
        
        // 查找媒体服务
        Service xmedia2 = services.FirstOrDefault(s => s.Namespace == "http://www.onvif.org/ver10/media/wsdl");
        if (xmedia2 != null)
        {
            media = new MediaClient(binding, new EndpointAddress(xmedia2.XAddr));
            media.ClientCredentials.HttpDigest.ClientCredential.UserName = account;
            media.ClientCredentials.HttpDigest.ClientCredential.Password = password;
            
            // 获取摄像头配置集
            profiles = media.GetProfiles();
            if (profiles != null)
            {
                // 启动视频流
                StreamVideoOnVLC(prms, vlcControl);
            }
        }
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

2. 使用VLC播放视频流

private void StreamVideoOnVLC(String[] recordParams, VlcControl vlcControl)
{
    // 配置流设置
    StreamSetup streamSetup = new StreamSetup();
    streamSetup.Stream = StreamType.RTPUnicast;
    streamSetup.Transport = new Transport();
    streamSetup.Transport.Protocol = TransportProtocol.UDP;
    
    // 获取流媒体URI
    string mtoken = profiles[0].token;
    MediaUri murl = media.GetStreamUri(streamSetup, mtoken);
    UriBuilder uri = new UriBuilder(murl.Uri);
    uri.Scheme = "rtsp";
    
    // 配置VLC选项
    List<string> options = new List<string>();
    options.Add(":rtsp-user=" + Account);
    options.Add(":rtsp-pwd=" + PassWord);
    options.Add(":file-caching=1500");
    options.Add(":network-caching=1500");
    options.Add(":codec=mediacodec,iomx,all");
    options.Add(":demux=h264");
    
    // 添加额外参数
    if (recordParams.Length != 0)
    {
        foreach (string param in recordParams)
        {
            options.Add(param);
        }
    }
    
    // 播放视频流
    vlcControl.Play(uri.Uri, options.ToArray());
}

3. 截图功能实现

public bool CrawlImg(out string msg, out string sjpegpicfilename)
{
    msg = "";
    sjpegpicfilename = "";
    try
    {
        // 生成唯一文件名
        sjpegpicfilename = System.DateTime.Now.ToString("yyyyMMdd_HHmmss") + _VlcControl.Name + ".jpg";
        
        // 调用VLC截图功能
        _VlcControl.TakeSnapshot(sjpegpicfilename);
        return true;
    }
    catch(Exception ex) 
    {
        msg = "相机"+_VlcControl.Name+"抓取图片失败";
        return false;
    }
} 使用示例 初始化摄像头 csharp 复制 下载  VlcControl vlcControl = new VlcControl();
OnvifCamera camera = new OnvifCamera();
bool success = camera.Init("192.168.1.100", "80", "admin", "password", vlcControl); 截图功能调用 csharp 复制 下载  string message, filename;
if(camera.CrawlImg(out message, out filename))
{
    Console.WriteLine("截图成功保存为: " + filename);
}
else
{
    Console.WriteLine("截图失败: " + message);
}

总结

本文介绍了如何使用C#和VLC库实现ONVIF摄像头的视频播放和截图功能。通过ONVIF协议,我们可以标准化地访问不同厂商的网络摄像头,而VLC库提供了强大的视频处理能力,两者结合可以快速开发出功能完善的视频监控应用。 这种方案的优势在于: •  跨摄像头厂商兼容(支持ONVIF协议)  •  利用VLC强大的编解码能力  •  C#开发便捷,易于集成到现有系统  •  代码结构清晰,功能模块化   希望本文对正在开发视频监控相关应用的开发者有所帮助。      

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐