盛暑时节传统二十四节气夏至视频按需定制录制是跨境电商和物流行业必不可少的一环不仅可以针对不同包裹的打包或者作业记录也可以随时观察流水线作业人员的操作是否符合规范整体架构以及功能分布本文是笔者以中间件-服务端的设计理念开发的一套视频按需定制录制系统支持跨域自定义水印授权使用等功能通过API方式请求中间件进而触发相机视频录制的流程支持单相机和多相机视频录制支持多相机视频合成等功能其他功能可按客户需求扩展相机只需要支持RTSP协议即可。以下是软件运行截图二十四节气之一夏至时节右键服务图标支持查看当前运行日志设置认证信息退出等操作。显示日志实时显示外界API请求以及中间件处理相机视频录制分割任务打点记录合成处理上传失败重传机制等一系列功能设置配置单相机或者多相机录制以及上传设置磁盘管理软件更新多相机合成模式画中画还是网格合并等等画中画网格授权管理支持离线和在线授权两种方式API如何通讯该软件以Httplistener监听本地请求支持跨域以及外网请求本文以局域网请求示例接口设计主要分为三个接口单/多相机相同入口/Status请求相机状态心跳等/Stop打点记录用于视频分割/StopEnd通知服务端开始异步视频分割视频水印添加视频按需合成视频上传等等录制核心启动录制:publicasync Taskstring StartRecordingAsync(string cameraId ) { await _sessionSemaphore.WaitAsync(); try { lock (_sessionLock) { if (_currentSession ! null _currentSession.IsRecording) { return JsonConvert.SerializeObject(new { code 400, message 已有录制会话进行中请先调用 Stop/StopEnd }); } if (!IsCameraConnected) { return JsonConvert.SerializeObject(new { code 400, message 相机未连接无法开始录制 }); } var config ConfigManager.CurrentConfig; string rtspUrl config.Rtsp1Url; _currentSession new SessionRecorder(rtspUrl); if (!_currentSession.Start(outstring error)) { return JsonConvert.SerializeObject(new { code 500, message error }); } CurrentState RecorderState.Recording; OnStatusChanged(录制会话已开始); return JsonConvert.SerializeObject(new { code 200, message 录制会话已启动 }); } } finally { _sessionSemaphore.Release(); } }停止点记录用于视频分割publicasync Taskstring StopRecordingAsync(string trackingNo, string watermark) { lock (_sessionLock) { if (_currentSession null || !_currentSession.IsRecording) { return JsonConvert.SerializeObject(new { code 400, message 没有活跃的录制会话 }); } _currentSession.AddStopPoint(trackingNo, watermark, DateTime.Now); return JsonConvert.SerializeObject(new { code 200, message 停止点已记录 }); } }后台视频分开水印合成上传publicasync Taskstring StopEndAsync(string wave) { await _sessionSemaphore.WaitAsync(); try { SessionRecorder session null; lock (_sessionLock) { if (_currentSession null || !_currentSession.IsRecording) return JsonConvert.SerializeObject(new { code 400, message 没有活跃的录制会话 }); session _currentSession; _currentSession null; } string result await session.StopEnd(wave); CurrentState RecorderState.Idle; OnStatusChanged($录制会话已结束波次{wave ?? 超时}); // 快速返回无需额外延迟 return JsonConvert.SerializeObject(new { code 200, message result }); } finally { _sessionSemaphore.Release(); } }授权机制支持在线和离线授权两种方式支持自动更新离线授权:根据私钥和公钥对称加密方式生成license文件在线授权:心跳实时请求授权API校验密钥和token的方式托盘UI软件启动自动启动心跳循环检测校验授权状态以及相机连接状态等等更新服务托盘图标显示展示授权和连接状态结束语感谢各位耐心查阅 如果您有更好的想法欢迎一起交流有不懂的也可以微信公众号联系博主作者公众号会经常发一些实用的小工具和demo源码需要的可以去看看另外如果觉得本篇博文对您或者身边朋友有帮助的麻烦点个关注赠人玫瑰手留余香您的支持就是我写作最大的动力感谢您的关注期待和您一起探讨再会