好多开发者使用场景,除了实现基础的低延迟RTSP、RTMP播放外,还需要实现RTSP、RTMP流数据的本地录像功能。 本文以大牛直播SDK的Windows平台播放模块为例,介绍下如何实现RTSP、RTMP流录像。 功能设计 [拉流]支持拉取RTSP流录像; [拉流]支持拉取RTMP流录像; [逻辑分离]和播放、转发功能完全分离,支持随时录像; [参数设置]支持设置单个录像文件大小、录像路径等,并支持纯音频、纯视频 、音视频录制模式; [音频转码]支持音频(PCMU/PCMA,Speex等)转AAC后再录像; [265支持]支持RTSP/RTMP H.265录制到MP4文件; [事件回调]从开始录像,到录像结束均有 Lib:SmartLog.dllSmartLog.libSmartPlayerSDK.dllSmartPlayerSDK.libavcodec-56.dllavdevice-56.dllavfilter-5.
技术背景我们在做RTSP、RTMP直播播放器的时候,有个比较重要的功能,就是拉流端实时录像,包括设置单个录像文件大小、文件前缀、audio转AAC、只录制视频或只录制音频、开始录像、停止录像事件状态回调等 我们录像模块,覆盖了RTMP、轻量级RTSP服务、RTSP|RTMP播放端录像,平台覆盖了Windows、Linux、Android、iOS,主要功能设计如下: [拉流]支持拉取RTSP流录像; [拉流 ]支持拉取RTMP流录像; [推流端录像]支持RTMP|RTSP推送端同步录像; [轻量级RTSP服务录像]支持轻量级RTSP服务SDK同步录像; [推流端录像实时暂停/恢复]支持推送端录像过程中实时暂停录像 *)path;/** * 录像相关: * * @param size 每个录像文件的大小 (5~500M), 默认200M * * @return {0} if successful */- (NSInteger 总结RTSP、RTMP播放端录像,我们的设计,是播放和录像分离,可以只录像或只播放,如果同时录像和播放,只需要一个拉流实例来完成。
好多开发者问我们,Unity环境下,除了RTSP或RTMP的播放,如果有录像诉求,怎么实现?实际上录像相对播放来说,更简单一些,因为不涉及到绘制,只要拉流下来数据,直接写mp4文件就好了。 (考虑到磁盘读写IO,Windows平台一般不建议多录录制),录像的话,需要考虑的是,设置好文件录制规则,比如,是否录制纯音频或纯视频、单个录制文件大小、文件录制目录等,并设置录像回调事件:/* * SmartPlayerWinMono.cs file_name); } else if (status == 2) //status 2:表示已经写好一个录像文件 { Debug.Log("RecordCallBack, 已生成一个录像文件 NTSmartPlayerSDK.NT_SP_Close(videoctrl[sel].player_handle_); videoctrl[sel].player_handle_ = IntPtr.Zero; }}以上是Unity平台RTMP或RTSP 播放端录像相关接口设计和调用实例,感兴趣的开发者可以参考。
技术背景上篇文章,我们介绍了Unity平台RTMP、RTSP播放器录像功能,这里,我们详细的介绍下,做个RTSP或RTMP拉流端录像模块有哪些需要考虑的技术点? 在我们常规的考量,RTMP或RTSP流录制,无非就是拉取数据写文件而已,接口设计StartRecorder()/StopRecorder()足矣。 后再录像;支持录像事件回调,从开始录像,到录像结束均有event callback上来。 除了上述的设计,还需要确保和RTSP、RTMP播放在一个实例下,确保播放的过程中可以随时录像,录像的过程中,可以随时播放。 :/*设置单个录像文件最大大小, 当超过这个值的时候,将切割成第二个文件size: 单位是KB(1024Byte), 当前范围是 [5MB-800MB], 超出将被设置到范围内*/NT_UINT32(NT_API
我们的视频平台EasyNVR能够接入RTSP协议的摄像头进行安防视频直播,其中分为录像版和直播版。顾名思义,直播版就是服务器不带云端存储功能,录像版既能进行视频直播,也能够调用录像观看。 EasyNVR录像版重启崩溃 多数的用户都会选择EasyNVR录像版,我们发现在录像版运行的时候,通过页面可以看到视频直播,但是录像显示的是近段时间为空录像,进入服务器重新启动软件服务,软件随即报错: 通过进入服务器发现,服务器上有挂载磁盘,录像写入到对应挂载的磁盘上,当挂载的磁盘出现问题导致软件启动出现问题,则报出对应的打印错误。 解决问题 主要问题是出现在录像的磁盘写入上,这个问题可以从两方面解决: 一是:修复磁盘挂载问题,找到磁盘出现问题原因(需要具体硬件运维人员具体分析),解决磁盘问题; 二是:修改软件录像磁盘写入位置,重新配置录像写入位置
TSINGSEE青犀视频各大平台都是可以接入摄像机及硬盘录像机的,比如EasyNVR这样的平台,如果接入硬盘录像机的话,则需要从录像机上取RTSP流接入进平台,因此对于硬盘录像机的操作及取流流程我们也要有比较详细的了解 本文就和大家分享一下海康硬盘录像机接入摄像机rtsp流的流程。 1.进入硬盘录像机鼠标右键选择【主菜单】,找到【系统配置】,如下: image.png 2.进入系统配置后选择网络配置根据自己网络情况配置硬盘录像机的ip地址: image.png 3.在主界面选择通道配置 ,进入配置摄像头通道界面: image.png 4.选择通道配置点击自定义添加: image.png 5.设置协议管理,修改rtsp的流地址: image.png 6.修改完成后,在自定义添加IP通道窗口页面进行配置摄像头的 ip,选择我们刚刚保存的RTSP协议并且输入摄像头的用户名与密码,点击添加: image.png 7.配置正确在通道管理页面可以播放刚刚配置的摄像头。
技术背景 我们在做Windows平台RTMP推送、轻量级RTSP服务录像模块的时候,部分开发者抱怨路径无法设置中文,只能设置为英文。 UInt64 param3, UInt64 param4, [MarshalAs(UnmanagedType.LPStr)] String param5, " start new recorder file"; byte[] utf8_bytes = Encoding.Default.GetBytes(param5) finish recorder file"; byte[] finished_utf8_bytes = Encoding.Default.GetBytes(param5) break; } EventGetPublisherEventMsg(event_log); } 总结 Windows平台RTMP推送、轻量级RTSP
目前,我们录像模块,涵盖了Windows/Linux/android/iOS 推送端(涵盖轻量级RTSP服务模块、RTMP推流模块和GB28181设备接入模块)和RTSP|RTMP播放端,主要实现了如下功能 : [拉流]支持拉取RTSP流录像; [拉流]支持拉取RTMP流录像; [推流端录像]支持RTMP|RTSP推送端同步录像; [轻量级RTSP服务录像]支持轻量级RTSP服务SDK同步录像; [推流端录像实时暂停 /恢复]支持推送端录像过程中实时暂停录像、恢复录像; [逻辑分离]大牛直播录像SDK不同于普通录像接口,更智能,和推送、播放、转发、内置轻量级RTSP服务SDK功能完全分离,支持随时录像; [url切换 ; [音频转码]支持音频(PCMU/PCMA,Speex等)转AAC后再录像; [265支持]支持RTSP/RTMP H.265录制到MP4文件; [推送端265录像]推送端SDK支持H265录像; [ [5MB-800MB], 超出将被设置到范围内 */ [DllImport(@"SmartPlayerSDK.dll")] public static extern UInt32
技术背景我们在对接Windows平台RTSP|RTMP直播播放模块的时候,有开发者提出来这样的技术需求,他们做驾考、全景摄像头、多路会议录制等场景的时候,希望把多路视频流数据,合并到一路保存或者对外推送到 技术实现多路RTSP|RTMP流合流,实际上我们2016年就有这块demo,当时合流的数据是本地采集的摄像头或屏幕数据,和外部RTSP、RTMP流,合成后输出(类似于传统意义的连麦操作)。 这里大概说下思路,外部的RTSP|RTMP流数据,解码后,把YUV或RGB数据回调上来,然后,按照图层的形式,分别贴摄像头、屏幕数据或解码后的流数据。 本次以四路RTSP摄像头数据合流为例:开始播放:/* * SmartPlayerDemo.cs * Author: daniusdk.com * QQ: 89030985 */private void (handle, 0);//RTSP timeout设置Int32 rtsp_timeout = 10;NTSmartPlayerSDK.NT_SP_SetRtspTimeout(handle, rtsp_timeout
上一篇我们介绍了RTSP的OPTION指令,客户端发起OPTION请求后,得到了RTSP服务器支持的指令。在此之后,客户端会继续向服务器发送DESCRIBE消息,来获取会话描述信息(sdp)。 描述: 首先用DESCRIBE描述请求类型;然后在URI中请求的服务器端地址;RTSP_VER表示RTSP的版本号,在加入\r\n消息头结束; 消息体包含以下字段: Accept:指明接收数据的格式,如 application/sdp表示接收sdp信息,之后加入\r\n表示此条目结束; CSeq:RTSP序列号,一般DESCRIBE包在RTSP请求过程中的序列号为2,之后加入\r\n表示此条目结束; UserAgent (23306)", nonce="a946c352dd3ad04cf9830d5e72ffb11e", stale="FALSE" Date: Fri, Apr 10 2020 19:07:19 GMT Authorization: Digest username="admin", realm="IP Camera(23306)", nonce="a946c352dd3ad04cf9830d5e72ffb11e
对于视频服务,直播和存储肯定是必不可少的环节,我们的视频流媒体服务器EasyNVR是用于安防行业的软件,主要是用于进行直播和录像存储。 我们的EasyNVR录像是由每个小时组成的(EasyNVR存储的录像为什么呈现每小时一段),更加方便用户对于录像的检索。 ? EasyNVR录像回看没有数据 最近有客户反应,进行查看录像回看发现录像没有数据,但是用户并没有进行删除录像的操作,而录像却查找不到,并显示空白。 ? 在上图输入命令pwd后,可以看到record目录是存在的,这个时候我们进入里面查看是否有录像。 ? 在进行权限更改之后我们在页面就可以正常查看录像了(但是权限没开启的那几天录像就没有被保存)。 ?
TSINGSEE青犀视频智能分析平台内一个功能是获取直播快照,比如EasyNVR视频直播中可以获取到直播快照的截图,但在实际使用中,也有用户需要获取云端录像快照。 ? EasyNVR的录像都是http服务发布的录像视频流,我们再通过ffmpeg来对云端录像的视频进行快照的获取。 Ffmpeg -ss “time” -hide_banner -i “input” -y -f image2 -vframes 1 snap.jpg 针对以上命令,我们只需要根据自身的需求添加需要获取录像的时间点和需要截取云端录像的视频源就可以 1、通过接口获取到需要截取录像的视频地址: ? 除了EasyNVR外,TSINGSEE青犀视频其他智能分析平台EasyCVR、EasyGBS等也可以获取录像的快照。如果大家有疑问,欢迎联系我们。
自从国标GB28181协议视频平台EasyGBS增加了录像计划模块之后,部分已经更新的用户都对此功能表示极为有用。鉴于EasyGBS的成功经验,我们对EasyNVR也开发了录像计划的功能。 ? EasyNVR视频平台的录像要单独配置一个页面,用来单独配置每一个通道每一天的录像,旧版的功能只能选择录制几天,无法精确到每天。 ? 要改变目前的录像功能,我们需要通过ui组件来实现。 首先,通过绘制录像计划ui组件来获取周一到周日的录像计划,然后选择录像保存的天数,最后选择需要设置的通道,将参数一起发送过去。 ? message: "保存成功", }); }); } }, } EasyNVR是TSINGSEE青犀视频云边端架构产品中支持RTSP
技术背景我们在对接Unity平台camera场景采集的时候,除了常规的RTMP推送、录像外,还有一些开发者,需要能实现轻量级RTSP服务,对外提供个拉流的RTSP URL。 服务;实时录像、暂停|恢复录像;实时预览。 _.interactable = true; btn_rtsp_service_.GetComponentInChildren<Text>().text = "停止RTSP服务"; _.interactable = true; btn_rtsp_publisher_.GetComponentInChildren<Text>().text = "发布RTSP"; 、轻量级RTSP服务,在虚拟仿真、医疗、教育等场景下,应用非常广泛。
之前的博文中我们和大家讲过EasyNVR的录像计划的实现方式,大家可以简单了解一下操作方式:EasyNVR边缘计算网关录像计划功能操作介绍。 关于EasyNVR录像计划的实现,TSINGSEE青犀视频的研发人员也耗费了不少心思,下面我们就讲一下是是如何实现的。 ? EasyNVR录像计划,其实就是在EasyNVR先为通道配置好录像计划,然后该通道就会以录像计划中的计划设置来录像。 例如:通道1只开启每天的下午1点到2点录像,那么通道1就只会在每天的下午1点到2点有录像,不会像现在一旦开启录像,就是直接录像一整天。 这样就可以达到节省磁盘空间的效果,录像也更灵活。 ,其他时间段不录像。
RTSP协议视频平台EasyNVR有直播版和录像版,录像版可以直接进行录像存储和回放,但是很多用户由于没有回放需求,就会使用硬盘录像机作为视频存储设备。 最近有用户反馈发现自己的海康硬盘录像机无法通过rtsp连接到EasyNVR的Web页面上。下面分享下排查过程。 问题解决 1、首先判断是否为用户的rtsp的配置问题,因为有的用户硬盘录像机版本比较新,所以有一些旧的rtsp规则是不生效的,所以我们通过rtsp规则的替换来测试是否为rtsp规则地址配置错误: ? 3、通过上图得知,其他的通道可以正常的进行播放,但是海康硬盘录像机同样也是不在线的,而且最奇怪的一点是海康的rtsp任何规则都无法播放,放到VLC播放器里面同样无效,但是在硬盘录像机的预览页面却是可以进行正常播放的 5、在经过调试之后我们发现摄像头的配置复合流就无法传输rtsp流到NVR或者VLC上: ?
关于录像计划的开发,大家可以查看此文:EasyNVR录像计划模块开发过程。 目前的录像计划分为全局录像计划和通道录像计划,全局录像计划是针对全通道或多选某些通道的录像计划;通道录像计划则是单独设置某个通道的,其优先级是单通道录像计划高于全局录像计划。 全局录像计划的开启及使用: 1、以管理员身份登录平台,点击顶部导航“录像计划”-“全局录像计划”,开启“直播录像计划”; 2、在录像模板里设置您所需的录像计划、录像保存天数(默认录像保存天数为3天); ”-“通道录像计划”,这时就会看到所有通道的列表信息,开启录像计划中的对号表示这个通道已经设置了录像计划,空白表示没有开启录像计划,需要在编辑里面设置。 image.png 2、点击编辑按钮后,首先开启“直播录像计划”,然后在录像模板里设置您所需的录像计划、录像保存天数,最后点击保存即可。
双向通道配置 同步边转边录,便于后续回放与存证 支持设备端配置 UI/控制接口 场景四:播放端录像与截图归档系统(多终端支持)适用场景:安防录像备份、远程取证、内容审查归档 链路组合:RTSP/RTMP 、码率控制支持屏幕/摄像头采集、音视频同步轻量级 RTSP Server SDKAndroid / Linux / Windows–RTSP硬编 / 软编–是(推送端录像)支持 ONVIF / VLC 低延迟播放模式:配置后可达 100–250ms 实际端到端延迟; ✅ 跨平台兼容性强:所有主力模块支持 Android / Windows / iOS / Linux,多数也支持 Unity3D 接入; 5. 推荐组合: RTSP 播放模块(解码 RTSP 视频流) RTSP → RTMP 转发模块(编码并转推) 本地录像模块(边转边录) 部署环境:Linux/Android 边缘设备,arm64 架构 案例5:国标平台视频接入 场景描述:已有 RTSP 摄像头或视频源,需将其通过国标协议对接至 GB28181 平台(如海康、华为、天翼云眼等)。
我们在编译EasyNVR时用到了很多不同的语言和编译方法,在前端页面的显示上也一直秉着按用户的观看习惯及使用习惯来进行编写,比如我们录像计划功能的实现简单易懂,操作便捷,能够让大家很快就上手操作和管理。 近期的研发当中我们发现EasyNVR从首页跳转到录像计划页面无法跳转成功,并且控制台出现报错,报错信息为:ReferenceError: _ is not defined image.png 我们从代码开始排查 setTimeout(() => { this.getTableData(); }, 500); }, 修改后重新测试录像计划跳转功能 ,功能正常,该问题即解决: image.png 关于录像计划的操作,大家可以参考此文:EasyNVR边缘计算网关录像计划功能操作介绍。 TSINGSEE青犀视频云边端架构中录像计划增加时,是我们进一步顺应用户操作的体现,与此同时,我们的任意一款视频云服务平台都是可以直接下载测试的,欢迎了解及测试。
,如超过最大文件大小,自动切换到下个文件录制) * * @param size: (MB), (5M~500M), if not in this range, set default onNTSmartEventCallbackV2(long handle, int id, long param1, long param2, String param3, String param4, Object param5) = "RTSP服务URL: " + param3; break; case NTSmartEventID.EVENT_DANIULIVE_ERC_PUSH_RTSP_SERVER_RESPONSE_STATUS_CODE : publisher_event ="RTSP status code received, codeID: " + param1 + ", RTSP URL: " + param3; ="服务器不支持RTSP推送, 推送的RTSP URL: " + param3; break; } String str = "当前回调状态:" + publisher_event