RTSP/RTMP播放端录像不可忽视的几个设计要点
很多开发者提到,拉取的摄像机(一般RTSP流)或RTMP流,如果需要录制,需要考虑哪些因素,本文以大牛直播SDK的Windows平台拉流端录像为例(github),做个简单的介绍:
1. 基础文件名设定
一般来说,本地录像的话,不可能每个文件单独命名,这个时候,需要考虑如文件名前缀、文件名是否添加日期、是否添加时间几个因素,以C#为例,具体接口定义如下:
/*如果三项都是0的话,将不能启动录像*/[StructLayoutAttribute(LayoutKind.Sequential)]public struct NT_SP_RecorderFileNameRuler{public UInt32 type_; // 这个值目前默认是0,将来扩展用[MarshalAs(UnmanagedType.LPStr)] public String file_name_prefix_; // 设置一个录像文件名前缀, 例如:daniulivepublic Int32 append_date_; // 如果是1的话,将在文件名上加日期, 例如:daniulive-2017-01-17public Int32 append_time_; // 如果是1的话,将增加时间,例如:daniulive-2017-01-17-17-10-36}/** 设置录像文件名生成规则*/[DllImport(@"SmartPlayerSDK.dll", EntryPoint = "NT_SP_SetRecorderFileNameRuler", CallingConvention = CallingConvention.StdCall)]public static extern UInt32 NT_SP_SetRecorderFileNameRuler(IntPtr handle, ref NT_SP_RecorderFileNameRuler ruler);
2. 设置录像目录、单个录像文件大小
这个不再赘述,设置录像目录是录像的基础操作,单个文件大小设定,可以更精细的控制单个文件size,一般建议单个文件不要过大,单次录制,超过设定的size,将自动切分保存到另外一个新的文件。
/** 设置本地录像目录, 必须是英文目录,否则会失败*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRecorderDirectory(IntPtr handle, [MarshalAs(UnmanagedType.LPStr)] String dir);/** 设置单个录像文件最大大小, 当超过这个值的时候,将切割成第二个文件* size: 单位是KB(1024Byte), 当前范围是 [5MB-800MB], 超出将被设置到范围内*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRecorderFileMaxSize(IntPtr handle, UInt32 size);
3. 音频转码后录像
一般来说,AAC格式更通用,设置录像时音频转AAC编码的开关, 可以把比如speex, pcmu, pcma转aac的后再录像,确保录制文件的audio格式更通用,转码会有一定的资源消耗。
/** 设置录像时音频转AAC编码的开关, aac比较通用,sdk增加其他音频编码(比如speex, pcmu, pcma等)转aac的功能.* is_transcode: 设置为1的话,如果音频编码不是aac,则转成aac, 如果是aac,则不做转换. 设置为0的话,则不做任何转换. 默认是0.* 注意: 转码会增加性能消耗*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRecorderAudioTranscodeAAC(IntPtr handle, Int32 is_transcode);
4. 更精细的音视频录像控制(纯音频、纯视频录制)
这两组接口设置的意义在于, 有些场景下可能不想录制视频,只想录音频,或是只录制视频、不录制音频,通过开放此类接口设定,让开发者操作更灵活。
/** 设置是否录视频,默认的话,如果视频源有视频就录,没有就没得录, 但有些场景下可能不想录制视频,只想录音频,所以增加个开关* * is_record_video: 1 表示录制视频, 0 表示不录制视频, 默认是1*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRecorderVideo(IntPtr handle, Int32 is_record_video);/** 设置是否录音频,默认的话,如果视频源有音频就录,没有就没得录, 但有些场景下可能不想录制音频,只想录视频,所以增加个开关** is_record_audio: 1 表示录制音频, 0 表示不录制音频, 默认是1*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRecorderAudio(IntPtr handle, Int32 is_record_audio);
5. 容易被忽略的callback事件
第五条,录像状态反馈,是好多开发者容易遗忘的,录像回调状态,可以很方便的告知上层开发者,什么时候开启了录像,什么时候结束了录像,什么时候写入了新的录像文件,这样便于上层逻辑开发人员,对录制好的文件进行二次编辑或处理。
/** 设置录像回调接口*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRecorderCallBack(IntPtr handle,IntPtr call_back_data, SP_SDKRecorderCallBack call_back);
6. 开始录像/停止录像
不再赘述,有了以上5条的设计,第六条,只要上层开发者按部就班的调用就好了。
/** 启动录像*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_StartRecorder(IntPtr handle);/** 停止录像*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_StopRecorder(IntPtr handle);
总结:
以上是一个友好的RTSP、RTMP拉流录像功能需要考虑的几点设计,遗憾的是,好多开发者之关注第六条,前五条或多或少的忽略了,除了常规的接口设计之外,录像功能需要考虑的其他因素还很多,后续有机会再做进一步分享。
RTSP/RTMP播放端录像不可忽视的几个设计要点相关推荐
- Windows平台RTSP|RTMP播放端SDK集成说明
2.1 demo说明 大牛直播SDK提供C++/C#两套接口,对外提供32/64位debug/release库,C++和C#接口一一对应,C#接口比C++接口增加前缀NT_PB_: WIN-Playe ...
- RTMP/RTSP推送端和RTMP/RTSP播放端录像设计探讨
好多开发者认为,无论是RTSP/RTMP推送端还是RTSP/RTMP播放端,涉及到录像,只要2个接口足矣:开始录像.停止录像. 实际场景下,一个好的录像模块,2个接口远远不够, 本文以大牛直播SDK( ...
- Flutter下实现低延迟的跨平台RTSP/RTMP播放
为什么要用Flutter? Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter正在被越来 ...
- Windows平台RTMP、RTSP播放器录像模块精细化控制
技术背景 上篇文章,我们介绍了Unity平台RTMP.RTSP播放器录像功能,这里,我们详细的介绍下,做个RTSP或RTMP拉流端录像模块有哪些需要考虑的技术点? 在我们常规的考量,RTMP或RTSP ...
- 如何实现Android端获取RTSP|RTMP流转推RTMP
技术背景 最近不少开发者找到我们,他们在做智能家居等传统行业时,希望实现在Android板件拉取本地的RTSP或RTMP流,然后对外推送RTMP出去,亦或内部启个轻量级RTSP服务,提供个对外对接的媒 ...
- RTSP播放器或RTMP播放器常用的事件回调设计
很多开发者在开发RTSP或RTMP播放器的时候,不晓得哪些event回调事件是有意义的,针对此,我们以大牛直播SDK(github)的Android平台RTSP/RTMP直播播放端为例,简单介绍下常用 ...
- 跨平台低延迟的RTMP/RTSP直播播放器设计实现
开发背景 2015年,当我们试图在市面上找一款专供直播播放使用的低延迟播放器,来配合测试我们的RTMP推送模块使用时,居然发现没有一款好用的,市面上的,如VLC或Vitamio,说白了都是基于FFMP ...
- Unity下如何实现RTMP或RTSP流播放和录制
技术背景 在探讨Unity平台RTMP或RTSP直播流数据播放和录制之前,我们先简单回顾下RTSP或RTMP直播流数据在Unity平台的播放流程: 通过Native RTSP或RTSP直播播放SDK回 ...
- 拉取数据_如何拉取公网RTSP/RTMP流在内网多客户端播放
好多情况下,一路RTSP或RTMP网络流过来后,想共享给更多局域网内的客户端播放,一般来说,有两种设计方案: 1. 拉取的RTSP或RTMP流,回调后的数据,转推RTMP服务器,内网部署一台RTMP服 ...
最新文章
- WebService 用户名密码验证
- r语言 plot_R和Python的特点对比,这样你就知道该怎么选择了
- [USACO4.2]Drainage Ditches
- 第十一期:数据挖掘其实就是为了干这四种事?
- 中关村windows11 32位专业版镜像v2021.07
- appbarlayout 折叠后 不允许滑动_还在纠结要不要建阳光房?看看可折叠阳光房,或许你就能做选择了...
- [ZT]javascript window resize 窗口改变事件
- Luogu2617 Dynamic Rankings
- linux 下的绘图软件Visio
- php 判断微信浏览器支付宝,PHP判断是手机端-PC端-微信浏览器
- python教程111-Python多条件计数与求和
- android excel在线,Excel在线编辑
- 关于nba的html设计,关于NBA篮球网页的设计毕业设计论文.pdf
- Android App Widget中如何调用RemoteView中的函数
- 【Electron-vue】构建桌面应用(25)- Ubuntu安装deb文件任务栏不显示应用图标
- 【SSD测试专题四】Performance
- python数组定义_python定义数组
- CentOS7 yum安装tomcat
- 异常System.Threading.Thread.AbortInternal
- pyinstaller打包py文件生成的exe报错Failed to execute script
热门文章
- 存储过程循环遍历一个月的每一天的函数_JavaScript 循环:如何处理 async/await
- python创建数组与列表_python基础(三):数组和列表
- footer.php置底,CSS五种方式实现Footer置底
- Java GregorianCalendar getActualMinimum()方法与示例
- mysql 创建分区表_Mysql分区表及自动创建分区Partition
- c++ abort 函数_C ++中带有示例的abort()函数
- Ubuntu apt-get和pip源更换
- Matlab制作朱利表
- android字符串复制到剪贴板
- Linux(CentOS 7)安装docker