这段时间一直在搞大华的执法记录仪设备的视频播放,总所周知,unity平台对视频播放不是很友好,而大华的SDK只有c#版本的并没有专门为unity做出来SDK,最开始尝试过使用SDK里面的方式获取YUV格式的视频流,再讲YUV格式的视频流转换为unity可以播放的格式,但是这个格式转换经常出现问题,而且很卡顿,所以呢我就用了ump插件进行rtsp视频流播放,还算是比较流畅的。

ump插件下载链接:https://pan.baidu.com/s/1AW50i41MgGHR9npdgJOf6Q 提取码:ahez  (仅供学习,请勿商用

大华的设备rtsp流构成分析:

    rtsp://[username]:[password]@[address]:[port]/cam/realmonitor?channel=[id]&subtype=[type]
 
    rtsp://   => 协议格式头
    username  => 用户名,例如:admin
    password  => 密码,例如:123456
    address   => IPC设备的网络地址,例如:192.168.1.65
    port      => IPC设备的RTSP输出端口,默认为554,若为默认可不填写
    id        => 通道号,起始为1。例如通道2,则为channel=2。
    type      => 码流类型,主码流为0(即subtype=0),辅码流为1(即subtype=1)。

原文链接:https://blog.csdn.net/haoyitech/article/details/79563281  (原文介绍了大华和海康的rtsp视频流构成,我这里只用了大华的,如果有需要海康的,请自行查找)

插件非常好用,只需要将UniversalMediaPlayer预制体拖放至场景中,将脚本上的rtsp流修改之后就可以查看视频了。

但是!由于我们需要的功能执法记录仪上没有,我们就定制了我们需要的功能,然后将执法记录仪设备系统升级了,结果升级之后,之前的获取rtsp视频流的功能,居然无法使用了,我在和大华的技术部联系过之后,得到的结论是升值后确实不能使用rtsp来播放视频流了,如果有需要可以定制。emm... ... 这就很尴尬了,定制是不可能的,但是问题还是要解决的,在热心同时的提示和帮助之下,我们采取了使用开启一个winform程序专门用来播放视频,虽然界面丑了点,但是还是完成了需要的功能。

winform代码:

调用大华SDK

using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NetSDKCS;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.IO;
using System;
using System.Collections.Generic;namespace MeshDaHuaTool
{public class DaHuaManager{#region Field 字段,属性private const int m_WaitTime = 5000;private const int SyncFileSize = 5 * 1024 * 1204;private static fDisConnectCallBack m_DisConnectCallBack;private static fHaveReConnectCallBack m_ReConnectCallBack;private static fRealDataCallBackEx2 m_RealDataCallBackEx2;private static fSnapRevCallBack m_SnapRevCallBack;private static fAudioDataCallBack m_AudioDataCallBack;private IntPtr m_LoginID = IntPtr.Zero;private IntPtr m_TalkID = IntPtr.Zero;private NET_DEVICEINFO_Ex m_DeviceInfo;private IntPtr m_RealPlayID = IntPtr.Zero;private uint m_SnapSerialNum = 1;private bool m_IsInSave = false;private bool m_Islogin = false;//对讲参数private const int SampleRate = 8000;private const int AudioBit = 16;private const int PacketPeriod = 25;private const int SendAudio = 0;private const int ReviceAudio = 1;//回放参数private IntPtr m_PlayBackID = IntPtr.Zero;//下载录像参数IntPtr m_DownloadID = IntPtr.Zero;fTimeDownLoadPosCallBack m_DownloadPosCallBack;/// <summary>/// 步长速度/// </summary>private int SpeedValue = 4;/// <summary>/// 最大步长速度/// </summary>private const int MaxSpeed = 8;/// <summary>/// 最小步长速度/// </summary>private const int MinSpeed = 1;/// <summary>/// 抓图保存根目录/// </summary>private string m_CaptureImageDirectory;/// <summary>/// 获取SDK错误/// </summary>private string LastError{get{return NETClient.GetLastError();}}/// <summary>/// 是否正在保存视频/// </summary>public bool IsinSave{get{return m_IsInSave;}}#endregion#region 回调public Action<ErrorType> OnSucess;public Action<ErrorArgs> OnError;public Action<string> OnCaptureSucced;#endregion/// <summary>/// 初始化/// </summary>public void Init(){m_DisConnectCallBack = new fDisConnectCallBack(DisConnectCallBack);m_ReConnectCallBack = new fHaveReConnectCallBack(ReConnectCallBack);m_RealDataCallBackEx2 = new fRealDataCallBackEx2(RealDataCallBackEx);m_SnapRevCallBack = new fSnapRevCallBack(SnapRevCallBack);m_AudioDataCallBack = new fAudioDataCallBack(AudioDataCallBack);m_DownloadPosCallBack = new fTimeDownLoadPosCallBack(TimeDownLoadPosCallBack);try{//注册回调函数NETClient.Init(m_DisConnectCallBack, IntPtr.Zero, null);NETClient.SetAutoReconnect(m_ReConnectCallBack, IntPtr.Zero);NETClient.SetSnapRevCallBack(m_SnapRevCallBack, IntPtr.Zero);//抓图路径赋值m_CaptureImageDirectory = @"C:\img";if (!Directory.Exists(m_CaptureImageDirectory)){Directory.CreateDirectory(m_CaptureImageDirectory);}}catch (Exception ex){OnError?.Invoke(new ErrorArgs(ErrorType.None, ex.Message));Process.GetCurrentProcess().Kill();}}/// <summary>/// 登录大华平台/// </summary>/// <param name="ip">IP地址</param>/// <param name="port">端口</param>/// <param name="username">用户名</param>/// <param name="password">密码</param>public void Login(string ip, ushort port, string username, string password){if (IntPtr.Zero == m_LoginID){m_DeviceInfo = new NET_DEVICEINFO_Ex();m_LoginID = NETClient.Login(ip, port, username, password, EM_LOGIN_SPAC_CAP_TYPE.TCP, IntPtr.Zero, ref m_DeviceInfo);if (IntPtr.Zero == m_LoginID){OnError?.Invoke(new ErrorArgs(ErrorType.Login, LastError));return;}OnSucess?.Invoke(ErrorType.Login);m_Islogin = true;}}/// <summary>/// 登出/// </summary>public void Logout(){if (!m_Islogin){return;}//关闭对讲if (IntPtr.Zero != m_TalkID && IntPtr.Zero != m_LoginID){NETClient.RecordStop(m_LoginID);NETClient.StopTalk(m_TalkID);}if (IsinSave){StopSaveVideo();}if (m_RealPlayID != IntPtr.Zero){StopRealPlay();}m_Islogin = false;if (m_LoginID == IntPtr.Zero){OnError?.Invoke(new ErrorArgs(ErrorType.Logout, "m_LoginID zero"));return;}bool result = NETClient.Logout(m_LoginID);if (!result){OnError?.Invoke(new ErrorArgs(ErrorType.Logout, LastError));return;}m_LoginID = IntPtr.Zero;m_RealPlayID = IntPtr.Zero;OnSucess?.Invoke(ErrorType.Logout);}/// <summary>/// 开始实时播放/// </summary>/// <param name="realplay_pictureBox"></param>public void StartRealPlay(PictureBox realplay_pictureBox){if (!m_Islogin){OnError?.Invoke(new ErrorArgs(ErrorType.StartRealPlay, "未登录"));return;}if (IntPtr.Zero == m_RealPlayID){// realplay 监视EM_RealPlayType type = GetRealPlayType();m_RealPlayID = NETClient.RealPlay(m_LoginID, GetChanel(), realplay_pictureBox.Handle, type);if (IntPtr.Zero == m_RealPlayID){OnError?.Invoke(new ErrorArgs(ErrorType.StartRealPlay, LastError));return;}}}/// <summary>/// 打开声音/// </summary>public void OpenSound(){if (!NETClient.OpenSound(m_RealPlayID)){OnError?.Invoke(new ErrorArgs(ErrorType.None, "打开声音错误: " + LastError));}}/// <summary>/// 关闭声音/// </summary>public void StopSound(){if (!NETClient.CloseSound()){OnError?.Invoke(new ErrorArgs(ErrorType.None, "关闭声音失败: " + LastError));}}/// <summary>/// 停止播放/// </summary>public void StopRealPlay(){if (!m_Islogin){OnError?.Invoke(new ErrorArgs(ErrorType.StopRealPlay, "未登录"));return;}if (IntPtr.Zero == m_RealPlayID){OnError?.Invoke(new ErrorArgs(ErrorType.StopRealPlay, "未开始播放,无法停止"));return;}bool ret = NETClient.StopRealPlay(m_RealPlayID);if (!ret){OnError?.Invoke(new ErrorArgs(ErrorType.StopRealPlay, LastError));return;}m_RealPlayID = IntPtr.Zero;OnSucess?.Invoke(ErrorType.StopRealPlay);}/// <summary>/// 抓图/// </summary>/// <param name="isRemote"> false 本地抓图,true 远程抓图 </param>public void CaptureImage(bool isRemote = false){//重新设置远程抓图的回调NETClient.SetSnapRevCallBack(m_SnapRevCallBack, IntPtr.Zero);if (!m_Islogin){OnError?.Invoke(new ErrorArgs(ErrorType.CaptureImage, "未登录"));return;}if (isRemote){NET_SNAP_PARAMS asyncSnap = new NET_SNAP_PARAMS();asyncSnap.Channel = (ushort)GetChanel();asyncSnap.Quality = 6;asyncSnap.ImageSize = 2;asyncSnap.mode = 0;asyncSnap.InterSnap = 0;asyncSnap.CmdSerial = m_SnapSerialNum;bool ret = NETClient.SnapPictureEx(m_LoginID, asyncSnap, IntPtr.Zero);if (!ret){OnError?.Invoke(new ErrorArgs(ErrorType.CaptureImage, LastError));return;}m_SnapSerialNum++;}else{if (IntPtr.Zero == m_RealPlayID){Console.WriteLine("没有打开实时预览,无法抓图");return;}string fileName = "local_" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".jpg";string filePath = @"C:\img" + "\\" + "client_" + fileName;bool result = NETClient.CapturePicture(m_RealPlayID, filePath, EM_NET_CAPTURE_FORMATS.JPEG);if (!result){OnError?.Invoke(new ErrorArgs(ErrorType.CaptureImage, LastError));return;}}}/// <summary>/// 保存视频/// </summary>public void SaveVideo(){if (IntPtr.Zero == m_RealPlayID){OnError?.Invoke(new ErrorArgs(ErrorType.StartSaveVideo, "未打开预览,无法保存录像"));return;}if (m_IsInSave){OnError?.Invoke(new ErrorArgs(ErrorType.StartSaveVideo, "保存中,不要重复操作"));return;}SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.FileName = "video_" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");saveFileDialog.Filter = "|*.dav";string path =   @"C:\savedata";if (!Directory.Exists(path)){Directory.CreateDirectory(path);}saveFileDialog.InitialDirectory = path;var res = saveFileDialog.ShowDialog();if (res == System.Windows.Forms.DialogResult.OK){m_IsInSave = NETClient.SaveRealData(m_RealPlayID, saveFileDialog.FileName); //call saverealdata function.if (!m_IsInSave){saveFileDialog.Dispose();OnError?.Invoke(new ErrorArgs(ErrorType.StartSaveVideo, LastError));}OnSucess?.Invoke(ErrorType.StartSaveVideo);}saveFileDialog.Dispose();}/// <summary>/// 停止保存视频/// </summary>public void StopSaveVideo(){if (m_IsInSave){bool ret = NETClient.StopSaveRealData(m_RealPlayID);if (!ret){Console.WriteLine(LastError);return;}m_IsInSave = false;OnSucess?.Invoke(ErrorType.StopSaveVideo);}}#region 云台控制/// <summary>/// 设置步长,范围在1-8/// </summary>/// <param name="speedValue">步长速度</param>public void SetStepSpeed(int speedValue){SpeedValue = Utility.Math.Clamp(speedValue, MinSpeed, MaxSpeed);}/// <summary>/// 云台控制消息 正上方为0 顺时针递增 0-7 是方向控制/// 8-9是zoom, 8+ ,9-/// 10-11是变焦,10+,11-/// 12-13是光圈,12+,13-/// </summary>public void PTZControl(string type){switch (type){case "0":PTZControl(EM_EXTPTZ_ControlType.UP_CONTROL, 0, SpeedValue, true);break;//上case "1":PTZControl(EM_EXTPTZ_ControlType.RIGHTTOP, SpeedValue, SpeedValue, true);break;//右上case "2":PTZControl(EM_EXTPTZ_ControlType.RIGHT_CONTROL, 0, SpeedValue, true);break;//右case "3":PTZControl(EM_EXTPTZ_ControlType.RIGHTDOWN, SpeedValue, SpeedValue, true);break;//右下case "4":PTZControl(EM_EXTPTZ_ControlType.DOWN_CONTROL, 0, SpeedValue, true);break;//下case "5":PTZControl(EM_EXTPTZ_ControlType.LEFTDOWN, SpeedValue, SpeedValue, true);break;//左下case "6":PTZControl(EM_EXTPTZ_ControlType.LEFT_CONTROL, 0, SpeedValue, true);break;//左case "7":PTZControl(EM_EXTPTZ_ControlType.LEFTTOP, SpeedValue, SpeedValue, true);break;//左上case "8":PTZControl(EM_EXTPTZ_ControlType.ZOOM_ADD_CONTROL, 0, SpeedValue, true);break;//zoom+case "9":PTZControl(EM_EXTPTZ_ControlType.ZOOM_DEC_CONTROL, 0, SpeedValue, true);break;//zoom-case "10":PTZControl(EM_EXTPTZ_ControlType.FOCUS_ADD_CONTROL, 0, SpeedValue, true);break;//变焦+case "11":PTZControl(EM_EXTPTZ_ControlType.FOCUS_DEC_CONTROL, 0, SpeedValue, true);break;//变焦-case "12":PTZControl(EM_EXTPTZ_ControlType.APERTURE_ADD_CONTROL, 0, SpeedValue, true);break;//光圈+case "13":PTZControl(EM_EXTPTZ_ControlType.APERTURE_DEC_CONTROL, 0, SpeedValue, true);break;//光圈-}}/// <summary>/// 云台控制/// </summary>/// <param name="type"></param>/// <param name="param1"></param>/// <param name="param2"></param>/// <param name="isStop"></param>private void PTZControl(EM_EXTPTZ_ControlType type, int param1, int param2, bool isStop){bool ret = NETClient.PTZControl(m_LoginID, GetChanel(), type, param1, param2, 0, isStop, IntPtr.Zero);if (!ret){OnError?.Invoke(new ErrorArgs(ErrorType.PTZControl, LastError));}}/// <summary>/// 开始对讲/// </summary>public void SatrTalk(){if (IntPtr.Zero != m_TalkID){OnError?.Invoke(new ErrorArgs(ErrorType.None, "正在对讲"));return;}IntPtr talkEncodePointer = IntPtr.Zero;IntPtr talkSpeakPointer = IntPtr.Zero;IntPtr talkTransferPointer = IntPtr.Zero;IntPtr channelPointer = IntPtr.Zero;NET_DEV_TALKDECODE_INFO talkCodeInfo = new NET_DEV_TALKDECODE_INFO();talkCodeInfo.encodeType = EM_TALK_CODING_TYPE.PCM;talkCodeInfo.dwSampleRate = SampleRate;talkCodeInfo.nAudioBit = AudioBit;talkCodeInfo.nPacketPeriod = PacketPeriod;talkCodeInfo.reserved = new byte[60];talkEncodePointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(NET_DEV_TALKDECODE_INFO)));Marshal.StructureToPtr(talkCodeInfo, talkEncodePointer, true);// set talk encode type 设置对讲编码类型NETClient.SetDeviceMode(m_LoginID, EM_USEDEV_MODE.TALK_ENCODE_TYPE, talkEncodePointer);NET_SPEAK_PARAM speak = new NET_SPEAK_PARAM();speak.dwSize = (uint)Marshal.SizeOf(typeof(NET_SPEAK_PARAM));speak.nMode = 0;speak.bEnableWait = false;speak.nSpeakerChannel = 0;talkSpeakPointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(NET_SPEAK_PARAM)));Marshal.StructureToPtr(speak, talkSpeakPointer, true);//set talk speak mode 设置对讲模式NETClient.SetDeviceMode(m_LoginID, EM_USEDEV_MODE.TALK_SPEAK_PARAM, talkSpeakPointer);NET_TALK_TRANSFER_PARAM transfer = new NET_TALK_TRANSFER_PARAM();transfer.dwSize = (uint)Marshal.SizeOf(typeof(NET_TALK_TRANSFER_PARAM));transfer.bTransfer = false;talkTransferPointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(NET_TALK_TRANSFER_PARAM)));Marshal.StructureToPtr(transfer, talkTransferPointer, true);//set talk transfer mode 设置对讲是否转发模式NETClient.SetDeviceMode(m_LoginID, EM_USEDEV_MODE.TALK_TRANSFER_MODE, talkTransferPointer);m_TalkID = NETClient.StartTalk(m_LoginID, m_AudioDataCallBack, IntPtr.Zero);Marshal.FreeHGlobal(talkEncodePointer);Marshal.FreeHGlobal(talkSpeakPointer);Marshal.FreeHGlobal(talkTransferPointer);Marshal.FreeHGlobal(channelPointer);if (IntPtr.Zero == m_TalkID){OnError?.Invoke(new ErrorArgs(ErrorType.None, "对讲失败:" + LastError));return;}bool ret = NETClient.RecordStart(m_LoginID);if (!ret){NETClient.StopTalk(m_TalkID);m_TalkID = IntPtr.Zero;OnError?.Invoke(new ErrorArgs(ErrorType.None, "对讲失败:" + LastError));return;}}/// <summary>/// 停止对讲/// </summary>public void StopTalk(){NETClient.RecordStop(m_LoginID);NETClient.StopTalk(m_TalkID);m_TalkID = IntPtr.Zero;}#endregion/// <summary>/// 当前播放模式/// </summary>/// <returns></returns>private EM_RealPlayType GetRealPlayType(){return EM_RealPlayType.Realplay;}/// <summary>/// 当前播放通道/// </summary>/// <returns></returns>private int GetChanel(){return 0;}#region 初始化回调函数/// <summary>/// network disconnection callback function original shape/// 断线回调函数/// </summary>/// <param name="lLoginID">user LoginID:Login's returns value 登陆ID</param>/// <param name="pchDVRIP">device IP 设备IP</param>/// <param name="nDVRPort">device prot 设备端口</param>/// <param name="dwUser">user data from Init function 用户数据</param>private void DisConnectCallBack(IntPtr lLoginID, IntPtr pchDVRIP, int nDVRPort, IntPtr dwUser){}/// <summary>/// network re-connection callback function original shape/// 重连回调函数/// </summary>/// <param name="lLoginID">user LoginID:Login's returns value 登陆ID</param>/// <param name="pchDVRIP">device IP,string type 设备IP</param>/// <param name="nDVRPort">device prot 设备端口</param>/// <param name="dwUser">user data from SetAutoReconnect function 用户数据</param>private void ReConnectCallBack(IntPtr lLoginID, IntPtr pchDVRIP, int nDVRPort, IntPtr dwUser){}/// <summary>/// real-time monitor data callback function original shape---extensive. support 32bit and 64bit/// 实时监视数据回调函数.支持32位和64位./// </summary>/// <param name="lRealHandle">monitor handle 监视句柄</param>/// <param name="dwDataType">callback data type ,only data set in dwFlag will be callback:回调数据类型///                         <para>0 original data (identicla SaveRealData saveddata)</para>///                         <para>1 frame data</para>///                         <para>2 yuv data</para>///                         <para>3 pcm audio data</para></param>/// <param name="pBuffer">byte array, length is dwBufSize 回调数据缓存///                      <para>callback data, except type 0, other type is base on frame, one frame data per callback</para></param>/// <param name="dwBufSize">pBuffer's size 回调数据的缓存大小</param>/// <param name="param">pointer to parameter structure,based on different type 参数结构体的指针///                    <para>if type is 0(original) or 2(yuv), param is 0</para>///                    <para>if callback data is frame data, pointer to NET_VideoFrameParam</para>///                    <para>if callback data is PCM data, pointer to NET_CBPCMDataParam</para></param>/// <param name="dwUser">user data,which input above</param>private void RealDataCallBackEx(IntPtr lRealHandle, uint dwDataType, IntPtr pBuffer, uint dwBufSize, IntPtr param, IntPtr dwUser){//do something such as save data,send data,change to YUV. 比如保存数据,发送数据,转成YUV等.}/// <summary>/// snapshot callback function original shape/// 远程抓图数据回调/// </summary>/// <param name="lLoginID">loginID,login returns value 登陆ID</param>/// <param name="pBuf">byte array, length is RevLen 数据缓存///                    <para>pointer to data</para></param>/// <param name="RevLen">pBuf's size 数据缓存大小</param>/// <param name="EncodeType">image encode type:0:mpeg4 I frame;10:jpeg 编码类型</param>/// <param name="CmdSerial">operation NO.,not used in Synchronous capture conditions 序列号</param>/// <param name="dwUser">user data,which input above 用户数据</param>private void SnapRevCallBack(IntPtr lLoginID, IntPtr pBuf, uint RevLen, uint EncodeType, uint CmdSerial, IntPtr dwUser){if (EncodeType == 10) //.jpg// type:0:mpeg4 I frame;10:jpeg{DateTime now = DateTime.Now;string fileName = "async_" + now.ToString("yyyy-MM-dd-HH-mm-ss") + ".jpg";string filePath = m_CaptureImageDirectory + "\\" + fileName;byte[] data = new byte[RevLen];Marshal.Copy(pBuf, data, 0, (int)RevLen);File.WriteAllBytes(filePath, data);OnCaptureSucced?.Invoke(filePath);}}/// <summary>/// 语音数据回调函数/// </summary>/// <param name="lTalkHandle"></param>/// <param name="pDataBuf"></param>/// <param name="dwBufSize"></param>/// <param name="byAudioFlag"></param>/// <param name="dwUser"></param>private void AudioDataCallBack(IntPtr lTalkHandle, IntPtr pDataBuf, uint dwBufSize, byte byAudioFlag, IntPtr dwUser){if (lTalkHandle == m_TalkID){if (SendAudio == byAudioFlag){//send talk data 发送语音数据NETClient.TalkSendData(lTalkHandle, pDataBuf, dwBufSize);}else if (ReviceAudio == byAudioFlag){//here call netsdk decode audio,or can send data to other user.这里调用netsdk解码语音数据,或也可以把语音数据发送给另外的用户try{NETClient.AudioDec(pDataBuf, dwBufSize);}catch (Exception ex){Console.WriteLine(ex.Message);}}}}/// <summary>/// 下载进度的回调/// </summary>/// <param name="lPlayHandle">下载句柄</param>/// <param name="dwTotalSize">下载总大小</param>/// <param name="dwDownLoadSize">已下载大小</param>/// <param name="index">文件序列</param>/// <param name="recordfileinfo">录像文件信息</param>/// <param name="dwUser">用户数据</param>private void TimeDownLoadPosCallBack(IntPtr lPlayHandle, uint dwTotalSize, uint dwDownLoadSize, int index, NET_RECORDFILE_INFO recordfileinfo, IntPtr dwUser){}#endregion}
}

界面按钮添加功能及外部调用接口

/***************************** * *发布时关闭Test宏定义 * * */
#define Test
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace MeshDaHuaTool
{public partial class Form1 : Form{DaHuaManager m_DhaMgr;CommandArg m_Arg = null;public Form1(){InitializeComponent();}public Form1(params string[] args ){
#if  falsem_Arg = new CommandArg("192.168.0.105", 37777, "name", "password","");//直接使用winform程序登录
#elseGetCommandArg(args);//外部程序调用
#endifInitializeComponent();this.Closed += Form1_Closed;}private void Form1_Load(object sender, EventArgs e){this.Size = new Size(560,420);if (m_Arg == null){MessageBox.Show("启动参数错误,点击关闭");this.Close();return;}if(m_Arg.Mode == "Hide"){this.Hide();this.MinimizeBox = true;this.ShowInTaskbar = false;}m_DhaMgr = new DaHuaManager();m_DhaMgr.OnError = OnErrorCallback;m_DhaMgr.Init();m_DhaMgr.Login(m_Arg.IP, m_Arg.Port, m_Arg.UserName, m_Arg.Password);m_DhaMgr.StartRealPlay(pictureBox1);m_DhaMgr.OpenSound();}//外部调用接口private void GetCommandArg(params string[] args){if (args.Length < 2){return;}m_Arg = CommandArg.Parse(args[1]);}private void OnErrorCallback(ErrorArgs error){MessageBox.Show($"错误类型:{error.APIType} ,详情: {error.Msg}");this.Close();}private void Form1_Closed(object sender, EventArgs e){if (m_DhaMgr == null) return;m_DhaMgr.StopSound();m_DhaMgr.Logout();}//抓图private void button1_Click(object sender, EventArgs e){m_DhaMgr.CaptureImage();}//保存视频private void button2_Click(object sender, EventArgs e){if (m_DhaMgr.IsinSave){m_DhaMgr.StopSaveVideo();button2.Text = "保存视频";}else{m_DhaMgr.SaveVideo();button2.Text = "停止保存";}}private void pictureBox1_Click(object sender, EventArgs e){}}
}

unity程序内调用接口:

public void VideoPlay(string IP,bool isHide){string Mode = "";if (isHide){Mode = "Hide";}var s = new CommandArg(IP, 37777, UserName, Password, Mode);//运行程序System.Diagnostics.Process pr = new System.Diagnostics.Process();//声明一个进程类对象pr.StartInfo.UseShellExecute = false;Debug.Log(Application.streamingAssetsPath + "/winform/MeshDaHuaTool.exe" );//到时候放在Application.streamingAssetsPath 或其他目录中pr.StartInfo.FileName = Application.streamingAssetsPath + "/winform/MeshDaHuaTool.exe";//指定运行的程序pr.StartInfo.Arguments = s.ToString();pr.Start();//运行}

unity 调用大华设备视频相关推荐

  1. Unity调用大华相机SDK采集图像及基本功能设定

    unity平台对视频播放不是很友好,而大华的SDK只有c#版本的并没有专门为unity做出来SDK,最开始尝试过使用SDK里面的方式获取YUV格式的视频流,再讲YUV格式的视频流转换为unity可以播 ...

  2. 怎样unity调用大华摄像头

    unity调用摄像头需要引用插件 UniversalMediaPlayer (这个为unity视频的播放插件) 有的可能也无法unity播放视频的,需要电脑装VLC media player 然后把U ...

  3. 视频融合平台EasyCVR如何添加大华设备的云台功能?

    EasyCVR平台支持多种协议.多种类型的设备接入,可以实现视频直播.转码与分发.平台级联.云台控制等,拥有灵活丰富的视频能力.平台基于云边端一体化架构,可在复杂的网络环境中,将分散的各类视频资源进行 ...

  4. WEB页面播放大华摄像头视频解决方案

    目前在网页上播放大华摄像头视频,有如下2种途径: 1)首选获取摄像头的hls协议地址,H5可直接播放 2)获取摄像头rtsp协议地址,用ffmpeg转换成hls再播放 近期做的一个项目,需要在WEB端 ...

  5. 大华设备通过GB28181协议接入EasyGBS,无法实现公网语音对讲问题的解析

    在监控行业的语音对讲,指的是监控设备与电脑.手机APP.平台软件之间进行语音交流.目前语音对讲功能已经广泛应用于我们日常监控场景中,比如GB28181协议国标平台EasyGBS,支持语音对讲. 摄像头 ...

  6. 通过WEB调用大华网络摄像头

    通过WEB调用大华网络摄像头 1.要调用的大华摄像头为Dahua 大华DH-IPC-HFW2100P-0600B 网络摄像机 (白色),摄像头外形如下图所示 2.调用效果如下图所示 3.下载大华网络摄 ...

  7. html调用大华摄像头demo

    html调用大华摄像头demo下载地址   http://download.csdn.net/download/heqinghua217/10114940 下载的时候,记得格式默认是dav,你可以修改 ...

  8. C#调用大华相机SDK获取图片,转换成VisionPro的Icogimage格式

    文章讲的是C#调用大华相机SDK,通过回调事件获取图片并转换成visionpro的Icogimage格式,文章底部会分享例程.在调用SDK之前,需要先安装大华的相机软件到C盘,不安装到C盘会显示依赖项 ...

  9. python+opencv打开大华摄像机视频

    学习笔记 python+opencv打开大华摄像机视频 python+opencv打开大华摄像机视频 import cv2 # 大华摄像机的视频采集语句,subtype=1,辅码流.0,主码流. ca ...

最新文章

  1. UART接口算法移植加密芯片的调试技巧——通讯调试
  2. php imagettftext 水印 粗体
  3. android Button 监听的几种方式
  4. 分页原理+分页代码+分页类制作
  5. helm3 helm-push插件安装及基本使用
  6. Python3 使用[]提取字符
  7. MYSQL性能调优及架构设计学习笔记-影响MYSQL性能的相关因素之实例分析
  8. java 算法_Java 浅谈数据结构和算法
  9. android视图绘制流程,android视图绘制流程完全解析带你一步步深入了解view二.docx...
  10. maya_Vray模型属性批量修改插件 v1.01 下载及教程
  11. 用单片机测量流体流速的_一种测量管道内流体流速的传感器的制作方法
  12. 简单博饼游戏的实现(java)
  13. php speex,开源语音格式speex教程
  14. C++ 会议安排(贪心算法)
  15. python热力图_一、python可视化——热力图
  16. deepin 安装git
  17. R统计绘图-corrplot热图绘制细节调整2(更改变量可视化顺序、非相关性热图绘制、添加矩形框等)
  18. 索引的数据结构--MySQL
  19. flex面试题及答案
  20. Python 模拟登录AUSU路由器获取在线用户列表

热门文章

  1. 【BZOJ1132】【POI2008】Tro 计算几何 叉积求面积
  2. 这些年,比特大陆与前员工的那些恩怨情仇
  3. ArcGIS API+Canvas +Vue框架 制作前端地图打印功能
  4. WordPress建站详细流程,WordPress入门
  5. 我喜欢的一首诗_再别康桥
  6. 拉格朗日乘子库恩塔克条件
  7. 疫情过后,企业到底该如何自救?
  8. 看微信如何往你的朋友圈里投广告?微信广告团队李昊在微信公开课演讲实录...
  9. 【微服务】什么是微服务?微服务与分布式的区别?微服务怎么具体实践微服务?服务端发现和客户端发现...
  10. HNU-电路与电子学-小班3