浏览器播放海康视频技术选型

以前公司的B/S在播放海康的实时流时,用的是海康SDK中的ocx控件,如果视频源换成大华或者我们自己的,就瞎了,所以考虑做一个框架可以支持任何实时h264码流。

经过几天的搜索,有如下几种方案:

1)用html5中的<video>标签 + flash播放器:

优点:①实现简单,只需要给video设定src即可,播放界面可以用css控制;②播放器多,比较常用的有jwplayer,video.js,而且他们都可以在支持或不支持video标签的浏览器中进行播放切换,video.js是加载的jwplayer;③flash支持实时流RTMP。

分析:安防监控中使用的都是基于RTP/RTSP协议,所以如果用这种方式,就需要把RTSP转为RTMP,工作量比较大,或者就要搭建RTMP服务器,工作量也比较大。

2)用vlc的ocx控件:

优点:①支持RTSP协议

分析:vlc控件可能不支持播放界面控制,没有详细测试;文档资料太少,学习难度大;不开源。

3)自己封装ocx控件:

优点:①代码可控;②界面、性能,易于修改;③播放库采用设备厂商提供的,效果还原度高。

分析:测试了用mfc做对话框,封装海康的网络库、播放库为ocx控件,但是只在IE下显示成功,其他浏览器没有测试成功。


结局,这个平台最后被公司放弃了,所以最后还是没能做完这一块。不过html5的<video>标签,必然是互联网的主流,底层的webRTC技术非常值得研究,目前的直播平台都是基于这个库,而且它开源。


你可以使用海康提供的 SDK (如 HCNetSDK 或者 EZ_SDK) 来播放海康的 MP4 视频。以下是一些示例代码,用于在 C# 中使用 HCNetSDK 播放海康 MP4 视频: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; namespace HCNetSDKTest { public partial class Form1 : Form { // HCNetSDK.dll 的路径 const string HCNetSDKDllPath = "HCNetSDK.dll"; // 登录句柄 private int iLoginID = -1; // 播放句柄 private int iPlayID = -1; // 播放窗口 private IntPtr hWnd; // SDK 初始化 [DllImport(HCNetSDKDllPath)] private static extern bool NET_DVR_Init(); // SDK 释放 [DllImport(HCNetSDKDllPath)] private static extern bool NET_DVR_Cleanup(); // 用户登录 [DllImport(HCNetSDKDllPath)] private static extern int NET_DVR_Login_V30(string sDVRIP, ushort wDVRPort, string sUserName, string sPassword, ref NET_DVR_DEVICEINFO_V30 lpDeviceInfo); // 用户注销 [DllImport(HCNetSDKDllPath)] private static extern bool NET_DVR_Logout(int iLoginID); // 打开实时预览 [DllImport(HCNetSDKDllPath)] private static extern int NET_DVR_RealPlay_V40(int iUserID, ref NET_DVR_PREVIEWINFO lpPreviewInfo, REALDATACALLBACK fRealDataCallback_V30, IntPtr pUser); // 关闭预览 [DllImport(HCNetSDKDllPath)] private static extern bool NET_DVR_StopRealPlay(int iPlayHandle); // 视频数据回调函数 public delegate void REALDATACALLBACK(int lRealHandle, uint dwDataType, IntPtr pBuffer, uint dwBufSize, IntPtr pUser); // 预览参数结构体 public struct NET_DVR_PREVIEWINFO { public int lChannel; public uint dwStreamType; public uint dwLinkMode; public IntPtr hPlayWnd; public uint bBlocked; public uint bPassbackRecord; public uint byPreviewMode; public uint byStreamID; public byte[] byReserve; } // 设备信息结构体 [StructLayout(LayoutKind.Sequential)] public struct NET_DVR_DEVICEINFO_V30 { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 48)] public string sSerialNumber; public byte byAlarmInPortNum; public byte byAlarmOutPortNum; public byte byDiskNum; public byte byDVRType; public byte byChanNum; public byte byStartChan; public byte byAudioChanNum; public byte byIPChanNum; public byte byZeroChanNum; public byte byMainProto; public byte bySubProto; public byte bySupport; public byte bySupport1; public byte byRes1; public short wDevType; public byte byRes2; public byte bySupport2; public ushort wFirmwareVersion; public ushort wNetProtoVersion; public ushort wUserProtoVersion; public ushort wSignalVersion; public ushort wIrdaVersion; public byte byRes3; public byte byHardwareVersion; public byte bySoftwareVersion; public byte byMiddleWareVersion; public byte byBuildDate; public byte byModifyDate; public byte byRes4; public byte byDevicePerformanceLevel; public byte byReserve2; } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // SDK 初始化 NET_DVR_Init(); // 获取播放窗口句柄 hWnd = pictureBox1.Handle; // 登录 NET_DVR_DEVICEINFO_V30 devInfo = new NET_DVR_DEVICEINFO_V30(); iLoginID = NET_DVR_Login_V30("192.168.1.64", 8000, "admin", "12345", ref devInfo); // 设置预览参数 NET_DVR_PREVIEWINFO previewInfo = new NET_DVR_PREVIEWINFO(); previewInfo.lChannel = 1; // 通道号 previewInfo.dwStreamType = 0; // 码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推 previewInfo.dwLinkMode = 0; // 连接模式:0-TCP,1-UDP,2-多播,3-RTP,4-RTP/RTSP,5-RSTP/HTTP previewInfo.hPlayWnd = hWnd; // 播放窗口句柄 previewInfo.bBlocked = 1; // 阻塞取流:1-是,0-否 previewInfo.byPreviewMode = 0; // 预览模式:0-正常预览,1-延迟预览 previewInfo.byPassbackRecord = 0; // 是否启用录像回传:0-不启用,1-启用 previewInfo.byStreamID = 1; // 码流ID,取值范围为从0开始的32个整数 previewInfo.byReserve = new byte[216]; // 保留字段 // 打开实时预览 iPlayID = NET_DVR_RealPlay_V40(iLoginID, ref previewInfo, null, IntPtr.Zero); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // 关闭预览 NET_DVR_StopRealPlay(iPlayID); // 注销 NET_DVR_Logout(iLoginID); // SDK 释放 NET_DVR_Cleanup(); } } } ``` 请注意,上述示例代码仅提供了基本的播放功能,并没有进行错误处理和异常处理。在实际应用中,您需要根据具体情况进行完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值