好多开发者使用场景,除了实现基础的低延迟RTSP、RTMP播放外,还需要实现RTSP、RTMP流数据的本地录像功能。 本文以大牛直播SDK的Windows平台播放模块为例,介绍下如何实现RTSP、RTMP流录像。 功能设计 [拉流]支持拉取RTSP流录像; [拉流]支持拉取RTMP流录像; [逻辑分离]和播放、转发功能完全分离,支持随时录像; [参数设置]支持设置单个录像文件大小、录像路径等,并支持纯音频、纯视频 、音视频录制模式; [音频转码]支持音频(PCMU/PCMA,Speex等)转AAC后再录像; [265支持]支持RTSP/RTMP H.265录制到MP4文件; [事件回调]从开始录像,到录像结束均有 , utf8_bytes);String recorder_file_name = Encoding.Default.GetString(default_bytes);StringBuilder sb
技术背景我们在做RTSP、RTMP直播播放器的时候,有个比较重要的功能,就是拉流端实时录像,包括设置单个录像文件大小、文件前缀、audio转AAC、只录制视频或只录制音频、开始录像、停止录像事件状态回调等 我们录像模块,覆盖了RTMP、轻量级RTSP服务、RTSP|RTMP播放端录像,平台覆盖了Windows、Linux、Android、iOS,主要功能设计如下: [拉流]支持拉取RTSP流录像; [拉流 ]支持拉取RTMP流录像; [推流端录像]支持RTMP|RTSP推送端同步录像; [轻量级RTSP服务录像]支持轻量级RTSP服务SDK同步录像; [推流端录像实时暂停/恢复]支持推送端录像过程中实时暂停录像 /PCMA,Speex等)转AAC后再录像; [265支持]支持RTSP/RTMP H.265录制到MP4文件; [推送端265录像]推送端SDK支持H265录像; [推送端外部编码数据对接录像]支持推送端外部编码后数据 总结RTSP、RTMP播放端录像,我们的设计,是播放和录像分离,可以只录像或只播放,如果同时录像和播放,只需要一个拉流实例来完成。
技术背景我们在对接Windows平台RTSP|RTMP直播播放模块的时候,有开发者提出来这样的技术需求,他们做驾考、全景摄像头、多路会议录制等场景的时候,希望把多路视频流数据,合并到一路保存或者对外推送到 RTMP服务。 技术实现多路RTSP|RTMP流合流,实际上我们2016年就有这块demo,当时合流的数据是本地采集的摄像头或屏幕数据,和外部RTSP、RTMP流,合成后输出(类似于传统意义的连麦操作)。 这里大概说下思路,外部的RTSP|RTMP流数据,解码后,把YUV或RGB数据回调上来,然后,按照图层的形式,分别贴摄像头、屏幕数据或解码后的流数据。 );if (add_layer_config(text_layer, type))text_layer_index_ = index++;return index > 0;}合成后数据,可以对外推送到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播放端录像相关接口设计和调用实例,感兴趣的开发者可以参考。
背景 好多开发者在做Android平台RTMP推送对接的同时,除了编码前的数据外,还有些外部编码数据推送诉求,他们希望外部的编码音视频数据不止可以实现RTMP推送,还可以同时在推送端实时录制下来,本文以我们 (官方)Android平台RTMP直播推送模块为例,介绍下外部数据对接流程和数据录制流程。 对接流程 开始推送 private boolean StartPush() { if (isPushing) return false; //relayStreamUrl = "rtmp * *@param channels 通道数, 如果需要录像的话必须传正确的值, 一般是1或者2 * * @return {0} if successful playerHandle); playerHandle = 0; } return false; } isRecording = true; return true; } 停止录像
部分情况下,EasyDSS视频流的存在与否就取决于kernel中配置文件参数的正确与否,本文分享的案例就是EasyDSS直播无回放录像的问题。 在EasyDSS-kernel中配置文件参数push rtmp中端口未根据easydss.ini的参数rtmp推流端口而修改,所以在修改该端口时,导致nginx没有推流到录像文件,直播无回放录像。 配置文件如下: 此处我们添加push rtmp参数的正则表达式,在获取到dss_rtmp_port端口发生变化时,根据正则表达式从kernel的配置文件中找到push rtmp该参数的值,并修改该端口 正则表达式:PatternConfPushRTMPPort = push+\s+rtmp.+:(\d+)/record/; 参考代码如下:
技术背景上篇文章,我们介绍了Unity平台RTMP、RTSP播放器录像功能,这里,我们详细的介绍下,做个RTSP或RTMP拉流端录像模块有哪些需要考虑的技术点? 在我们常规的考量,RTMP或RTSP流录制,无非就是拉取数据写文件而已,接口设计StartRecorder()/StopRecorder()足矣。 后再录像;支持录像事件回调,从开始录像,到录像结束均有event callback上来。 除了上述的设计,还需要确保和RTSP、RTMP播放在一个实例下,确保播放的过程中可以随时录像,录像的过程中,可以随时播放。 录像模块设计无图无真相,先看录像设置:图片开始录像、停止录像:图片Windows平台,我们提供了C++和C#的接口,本文以C++接口设计为例:先说录像设置:设置录制纯音频或纯视频: /**
技术背景 我们在做Windows平台RTMP推送、轻量级RTSP服务录像模块的时候,部分开发者抱怨路径无法设置中文,只能设置为英文。 、暂停录像、停止录像为例,调用逻辑如下,可以看到除了中文路径诉求,录像模块还可以添加前缀、添加文字、水印: public bool StartRecorder() { Encoding.Default.GetBytes(param5); byte[] default_bytes = Encoding.Convert(Encoding.UTF8, break; } EventGetPublisherEventMsg(event_log); } 总结 Windows平台RTMP 推送、轻量级RTSP服务配套的录像模块,除了设置录像保存路径外、还可以设置录像文件前缀、是不是添加日期、时间等,还有就是单个录像文件大小,超过这个大小后,会自动切换到下个文件。
技术设计本文以大牛直播SDK的Windows平台RTSP|RTMP直播播放录制功能设计为例,谈谈我们的接口的细粒度设计。 目前,我们录像模块,涵盖了Windows/Linux/android/iOS 推送端(涵盖轻量级RTSP服务模块、RTMP推流模块和GB28181设备接入模块)和RTSP|RTMP播放端,主要实现了如下功能 : [拉流]支持拉取RTSP流录像; [拉流]支持拉取RTMP流录像; [推流端录像]支持RTMP|RTSP推送端同步录像; [轻量级RTSP服务录像]支持轻量级RTSP服务SDK同步录像; [推流端录像实时暂停 ; [音频转码]支持音频(PCMU/PCMA,Speex等)转AAC后再录像; [265支持]支持RTSP/RTMP H.265录制到MP4文件; [推送端265录像]推送端SDK支持H265录像; [ Encoding.Default.GetBytes(file_name); byte[] default_bytes = Encoding.Convert(Encoding.UTF8,
EasyDSS是TSINGSEE青犀视频云边端架构中支持RTMP协议前端设备的视频直播点播平台,除了网页直播和点播外,也支持视频录像,录像一般根据录像计划设定即可。 在近期开发中,我们增加了EasyDSS获取录像指定时间的m3u8播放地址功能。 strings.HasSuffix(dirPath, "\\") { dirPath = dirPath + string(os.PathSeparator) } // 创建 video.m3u8 文件 mfile, err := os.Create(dirPath + m3u8Name) if err ! realTsPaths[1], "/") periodPath := filepath.Join(realTsPaths[0], sDay, tsId[0], fmt.Sprintf(`%s_record.m3u8`
视频直播有很多协议,rtmp、rtsp、hls等就自己去了解,业务有做到就会了解一些。 公司经过软硬件测试,发现目前公司使用rtmp流直播延迟是最小的,rtmp需要flash,chrom在今年年底要完全禁止flash,不像现在是默认禁止还能允许。 移动端使用的是m3u8直播,需要安装一个新的依赖:videojs-contrib-hls 测试了一下,必须要有 播放页使用: import videojs from 'video.js' import video-js.css' import 'videojs-contrib-hls' 原本老版本直接切换src就可以了,连videojs都没用,不知道为什么这个版本不行,于是跟PC方法一样,只是type对于m3u8是 期间还有另外的一些问题,现在也重现不了,主要是有些问题也不知道为什么就解决了,m3u8和mp4还会出现跨域问题,我这边是nginx加允许头header。
EasyCVR平台支持海量视频汇聚与管理、处理与分发、智能分析等视频能力,在接入协议上,不仅支持国标GB28181协议、RTSP/Onvif、RTMP等标准协议,还支持HIKSDK、大华SDK、海康Ehome 等厂家私有协议与SDK,可分发RTSP、RTMP、FLV、HLS、WebRTC等多种格式的视频流。 平台可灵活拓展,能实现的视频功能包括视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联等。 图片有用户反馈,EasyCVR平台的历史视频查看接口出现了异常,返回获取录像失败,请求我们排查协助。图片收到反馈后,立即让其将调用的接口提交技术人员,经查验调用接口并无问题。 再次远程排查,发现其他的协议接入的云端录像都能正常返回,但是rtmp_push推上来的则返回上述错误。我们初步猜测,按时间段调用的接口,可能不适用于RTMP推流这种接入协议。
技术背景我们在对接Unity平台camera场景采集的时候,除了常规的RTMP推送、录像外,还有一些开发者,需要能实现轻量级RTSP服务,对外提供个拉流的RTSP URL。 直播推送;轻量级RTSP服务;实时录像、暂停|恢复录像;实时预览。 { StopPushRTMP(); btn_rtmp_pusher_.GetComponentInChildren<Text>().text = "推送RTMP "; return; } String url = rtmp_pusher_url_.text; if (url.Length < 8) 推送、录像、轻量级RTSP服务,在虚拟仿真、医疗、教育等场景下,应用非常广泛。
推流端使用publish消息向rtmp服务器端发布一个命名的流,发布之后,任意客户端都可以以该名称请求视频、音频和数据。我们首先来看一下publish消息的组织结构: ? 使用number类型表示事物ID; commandObject:对于publish消息,该部分为空,用null类型表示; publishName:发布的流的名称,使用string类型表示,比如我们发布到rtmp ://192.168.1.101:1935/rtmp_live/test,则test为流名称,也可以省略,此时该字段为空字符; publishType:发布的流的类型,使用string类型表示,有3种类型 ,live则不会在rtmp服务器上产生文件。 如果发布的地址为rtmp://192.168.1.101:1935/rtmp_live,则其他任何客户端都可以访问该url获取视频资源,进而进行播放。
精确查找流程如下:遍历本地(数据库)指定录像存储路径,找出在指定开始时间和结束时间范围内的M3U8列表,注意:这里找到的M3U8列表的区间是要小于开始时间,和大于结束时间的最接近值,以确保指定时间范围在查找到的 M3U8列表队列中;再在指定的M3U8列表里面查找在开始时间和结束时间内的TS,并重新生成TS列表,如果时间戳连续,甚至可以将TS文件连接成一个M3U8列表,从而播放器播放可以不用跨M3U8列表直接播放 //时间戳字串转换成 time_t nBegin = StringToTime(begin);time_t nEnd = StringToTime(end);// 算法描述:获取包含begin-end录像开始的时间命名文件夹以及录像结束的时间命名文件夹 << "string_ref: " << m3u8_file.data() << endl;//以流名称开始,.m3u8结束的文件我们视为正常录像的列表文件string sM3u8Name = name _ + ".m3u8";if (m3u8_file.ends_with(sM3u8Name)){int pos = m3u8_file.find_last_of(split);boost::string_ref
"EasyDarwin": { "Body": { "HLS": "/hls/nvr1_channel1_98960064/nvr1_channel1_98960064.m3u8" ,RTMP表示RTMP录像视频流,Handle表示流唯一标识 调用demo /* *param:当前播放通道号 */ function recordPlayer(param){ var channel1_123045152//流地址 格式 // /hls/nvr1_channel1_123045152/nvr1_channel1_123045152_live.m3u8/ +"/hls/"+urlid+"/"+urlid+"_live.m3u8";//hls地址 playerStream(rtmpurl) }) } 注意: 成功调用改接口会放回一个RTMP流地址,但是并不完整,我们 需要 根据EasyNVR自身的rtmp端口,拼接出一个完整的RTMP;同时也会生成HLS流地址,根据自身需求,播放对应的地址来达到对应时间端录像的回放
]完美支持和录像SDK组合使用,录像相关功能,可参见"8. ]完美支持和录像SDK组合使用,录像相关功能,可参见"8. ]完美支持和录像SDK组合使用,录像相关功能(支持RTSP H.265流录制,支持PCMA/PCMU转AAC后录制,支持设置只录制音频或视频),可参见"8. 8. Windows/Android/iOS RTMP/RTSP多路流媒体转RTMP推送SDK 如不单独说明,系Windows、Android、iOS全平台支持。 SEI扩展信息(H.264); [自定义数据]持发送自定义用户数据(如自定义utf8字符串); [二进制数据]支持发送二进制数据; [播放端解析]RTSP/RTMP直播播放端SDK支持utf8文本
2021-4-6 更新 修改图片生成BUG 修改点播更新BUG 2021-8-8更新 修改了无法生成连续剧的节目的BUG 加入了对中控的认证, 所有中控的相关认证都在此,这个认证授权是建立交互通道的过程 现在屏幕采集\录像\rtmp推流工具也完成了第二版,所以同步更新一下博文. }/index.m3u8 点播 对于点播只支持MP4, 点播的地址格如下 RTMP rtmp://{ip}:{rtmp_port}/vod/{name } HTTP http://{ip}:{ 注意: 开启时rtmp_notify要正确的接口地址设值,否则无法向外发送通知. enable_rtmp_record_manual 是否启用手动录像模式, 默认是自动,即有流上传就自动开始录像 xml version=”1.0″ encoding=”UTF-8″?
1、流媒体服务软件LiveNVR可接入传统监控行业里面的高清网络摄像机的RTSP直播流,及 RTMP、HTTP-FLV、M3U8等其它直播流, 实现互联网直播分发;可分发多种格式流,HTTP-FLV/WS-FLV /RTMP/RTSP/WebRTC/HLS。 支持GB28181注册级联到第三方国标平台; 同时能实时云端存储、录像计划、检索、时移回放2、配置开启录像(云端录像)LiveNVR-》通道配置-》配置录像保留(天)3、录像回看(云端录像)开启录像存储的 ,可以在录像回看页面看到3.1、查看录像3.1.1、时间轴视图3.1.2、列表视图点击右上角可以切换为 列表视图4、云端录像相关接口这里接口查看的是存储在服务器上面的视频录像5、如何分享时间轴录像回看? width="640" height="360" allowfullscreen allow="autoplay; fullscreen"></iframe>XML 复制 全屏7、RTSP/HLS/FLV/RTMP
LiveGBS支持集成分享的直播页面,也可以集成云端录像或是设备录像回看页面2.1、视频流地址播放器集成通过接口或其它方式获取视频流的地址,设置到web播放器|APP播放器|PC播放器中,进行播放。 通过传递的type 区分是设备录像 还是 云端录像<iframe src="http://ip:10000/playback.html? 直播流地址取上面接口返回的 <em>RTMP</em> 字段,对应的 <em>RTMP</em> 端口需要在服务端开放 TCP,如"RTMP": "rtmp://192.168.2.135:11935/hls/34020000001110000234 ws-flv/hls/{设备国标编号}{通道国标编号}.flvHLS: http://{cmsip}:{port}/sms/{sms_id}/hls/{设备国标编号}{通道国标编号}/live.m3u8RTMP ws-flv/hls/{设备国标编号}{通道国标编号}.flvHLS: https://{cmsip}:{port}/sms/{sms_id}/hls/{设备国标编号}{通道国标编号}/live.m3u8RTMP