好多开发者认为,无论是RTSP/RTMP推送端还是RTSP/RTMP播放端,涉及到录像,只要2个接口足矣:开始录像、停止录像。

实际场景下,一个好的录像模块,2个接口远远不够, 本文以大牛直播SDK(Github)RTSP/RTMP推送和RTSP/RTMP播放端扩展录像模块为例,介绍下一个好的录像模块,需要具备哪些基本功能属性。

Android、iOS平台不再赘述,本文以Windows平台C#接口为例,先说推送端:

1. 设置录像目录

录像目录不必多解释,为了便于录像文件管理,设置指定的录像目录是基础操作。

 /** 设置本地录像目录, 必须是英文目录,否则会失*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_SetRecorderDirectory(IntPtr handle, [MarshalAs(UnmanagedType.LPStr)] String dir, IntPtr pReserve);

2. 设置单个录像文件最大大小

之所以设置单个录像文件大小,有两个出发点:第一,控制单个文件大小范围,不至于因单个文件过大,中途异常退出或文件过大导致写入失败;第二,达到设定文件大小size后,自动切割生成下个录像文件,便于文件管理。

        /** 设置单个录像文件最大大小, 当超过这个值的时候,将切割成第二个文件* * size: 单位是KB(1024Byte), 当前范围是 [5MB-1G], 超出将被设置到范围内*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_SetRecorderFileMaxSize(IntPtr handle, UInt32 size);

3. 设置录像文件名生成规则

设置文件名生成规则,主要是为了不至于每个文件都需要开发者单独指定名称,开发者只要制定录制规则,比如文件名前缀、是否加日期、是否加时间等属性,自动生成文件名。

        /** 设置录像文件名生成规则*/[DllImport(@"SmartPublisherSDK.dll", EntryPoint = "NT_PB_SetRecorderFileNameRuler", CallingConvention = CallingConvention.StdCall)]public static extern UInt32 NT_PB_SetRecorderFileNameRuler(IntPtr handle, ref NT_PB_RecorderFileNameRuler ruler);
    /*如果三项都是0的话,将不能启动录像*/[StructLayoutAttribute(LayoutKind.Sequential)]public struct NT_PB_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}

4. 启动录像

不多解释,这个只要涉及录像功能,都需要的。

        /** 启动录像*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_StartRecorder(IntPtr handle, IntPtr pReserve);

5. 暂停/恢复录像

暂停录像,好多开发者不可理解,这里举个简单的李总,比如老师每次上课2小时,中间有2次下课休息时间,下课期间,老师可暂停录像,等开始上课后,恢复录像,这样确保了上课内容录制的连续性和完整性。

     /** 暂停录像* * is_pause: 1表示暂停, 0表示恢复录像, 输入其他值将调用失败* * 成功返回NT_ERC_OK* 返回NT_ERC_PB_NEED_RETRY, 请隔一段时间再尝试调用*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_PauseRecorder(IntPtr hanlde, Int32 is_pause);

6. 停止录像

不多解释,这个只要涉及录像功能,都需要的。

        /** 停止录像*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_StopRecorder(IntPtr handle);

7. 录像事件回调

录像事件回调,是好多开发者在设计录像功能模块时容易忽略的,回调的目的是给上层一个反馈,比如开始录像、停止录像状态反馈,亦或单个录像完成后的事件回调。

         NT_PB_E_EVENT_ID_RECORDER_START_NEW_FILE    = NT_PB_E_EVENT_ID_BASE | 0x7, /*录像写入新文件, param5表示录像文件名*/NT_PB_E_EVENT_ID_ONE_RECORDER_FILE_FINISHED = NT_PB_E_EVENT_ID_BASE | 0x8,   /*一个录像文件完成, param5表示录像文件名*/
                case (uint)NTSmartPublisherDefine.NT_PB_E_EVENT_ID.NT_PB_E_EVENT_ID_RECORDER_START_NEW_FILE:event_log = " start new recorder file";if (!String.IsNullOrEmpty(param5)){label_event_status.Text = event_log + " file name:" + param5;}break;case (uint)NTSmartPublisherDefine.NT_PB_E_EVENT_ID.NT_PB_E_EVENT_ID_ONE_RECORDER_FILE_FINISHED:event_log = " finish recorder file";if (!String.IsNullOrEmpty(param5)){label_event_status.Text = event_log + " file name:" + param5;}break;

播放端除了上述设置录像目录、指定录像文件名规则,开始录像/停止录像和event回调外,还加入了以下接口:

8. 只录制音频或视频

这个很好理解,比如音视频都有的场景,好多开发者可能实际只需要用到音频或视频,这个时候,就凸显出接口意义了。

        /** 设置是否录视频,默认的话,如果视频源有视频就录,没有就没得录, 但有些场景下可能不想录制视频,只想录音频,所以增加个开关* * 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);

9. 设置录像时音频转AAC编码的开关

设置录像时音频转AAC编码的开关的意义在于,比如有些rtsp流,audio是PCMA或PCMU的,有些rtmp流,audio是SPEEX的,实际使用场景下,aac比较通用,sdk增加其他音频编码(比如speex, pcmu, pcma等)转aac的功能,确保存储下来的MP4文件通用性更好。

        /** 设置录像时音频转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);

总结

一个好多录像模块设计,应该是可作为单独功能模块使用(如同时多路录像存档),亦可和其他模块组合调用,此外,需要和RTMP/RTSP推送、RTMP/RTSP播放、RTSP转发、内置轻量级RTSP服务功能完全分离,支持随时录像,支持设置单个录像文件大小、录像路径等,并支持纯音频、纯视频、音视频录制模式,支持音频(PCMU/PCMA,Speex等)转AAC后再录像,支持RTSP/RTMP H.265(hevc),支持采集端(推送端)录像过程中,暂停录像、恢复录像,从开始录像,到录像结束均有event callback上来等。

这么看下来,录像模块2个接口确实远远不够。

RTMP/RTSP推送端和RTMP/RTSP播放端录像设计探讨相关推荐

  1. 数据推送选择GB28181、RTSP还是RTMP?

    GB/T28181 国标GB/T28181协议全称<安全防范视频监控联网系统信息传输.交换.控制技术要求>,是一个定义视频联网传输和设备控制标准的白皮书,由公安部科技信息化局提出,该标准规 ...

  2. 海康大华等安防摄像机采用通用RTSP协议流转RTMP推送至Web无插件播放展示的流程方法

    行业现状 中国互联网化的进程已经越来越快了,各个行业都在进行着互联网化的改造,流媒体.音视频,作为跑在互联网上最大量级的数据类型,其从编码方式到传输协议到终端兼容都成为各家标准抢占的高点,RTMP.H ...

  3. Windows平台RTMP直播推送集成简要说明

    好多开发者在集成大牛直播SDK (官方)的Windows平台RTMP推送模块时吓一跳,怎么这么多接口?本文做个简单的拆分: 初始化 初始化之前,如需设置日志路径,调用NTSmartLog.NT_SL_ ...

  4. 软件_搭建rtmp视频推送环境,腾讯云,ubuntu16

    原创博客地址:软件_搭建rtmp视频推送环境,腾讯云,ubuntu16 1,安装conda,ffmpeg,nginx,nginx-rtmp-module (建议先修改主机pip,conda的源) 安装 ...

  5. 使用极光推送实现分组发送和服务端集成

    推送功能在手机应用开发中越来越重要,几乎成为所有App必备的功能,由于Android本身没有消息推送机制,通常采用的是基于XMPP协议的推送,但这种开发很麻烦,因此在市场上应运而生了提供消息推送服务的 ...

  6. 知名评测软件 3DMark 推送了更新,为 PC 端带来全新的 CPU 跑分工具“CPU Profile”

    最新信息 6 月 25 日消息 昨日知名评测软件 3DMark 推送了更新,为 PC 端带来全新的 CPU 跑分工具"CPU Profile".此前这一软件专注于显卡评测,包含多种 ...

  7. 海康RTSP流转RTMP并推送至Web端展示

    最近帮着老师做项目的时候碰到一个难题,将海康摄像头的影像实时传输到前端页面进行展示.Google查了两天,终于有些眉目,记录一下经验. 大致需要经过以下几个步骤: 获取海康摄像头的视频流(基于RTSP ...

  8. 【技术分享】Windows平台低延迟RTMP、RTSP播放器接口设计探讨

    背景 我们看过了太多介绍RTSP.RTMP播放相关的技术资料,大多接口设计简约,延迟和扩展能力也受到一定的局限,好多开发者希望我们能从接口设计的角度,大概介绍下大牛直播SDK关于RTMP.RTSP播放 ...

  9. 物联网设备数据流转之数据如何实时推送至前端:WebSocket服务端推送

    背景 还记得,我们在物联网设备数据流转之实时数据从哪里来.如何转发:Node.js, MQTT, EMQX的WebHook这篇文章中,当 EMQX 的 WebHook 收到来自设备的消息时,我们当时只 ...

最新文章

  1. BZOJ 2257: [Jsoi2009]瓶子和燃料
  2. java按钮监听休眠_java-休眠监控解决方案
  3. OpenAI的GPT-3花费了1200万美元,现在放出商用API,人人皆可拿来自动生成文本、编写代码...
  4. java手机号归属地查询_【原创】Java实现手机号码归属地查询
  5. 用java的io做一个代码计数器,如何制作Java页面计数器_java
  6. js日期格式判断(2018/01/30) -方法 小时分秒格式判断((HH:MM)
  7. 【HDU - 1276】士兵队列训练问题 (报数问题 模拟)
  8. LearnETutorial 中文系列教程【翻译完成】
  9. Java普通代码块,构造代码块,静态代码块区别,执行顺序的代码实例
  10. 信息系统项目管理01——信息化和信息系统
  11. linux 混杂设备 miscdevice设备介绍
  12. .NET开发不可错过的25款必备工具,徐汇区网站设计
  13. java进制转换的简单方法
  14. 动态生成的html click事件,如何动态生成HTML时将jquery附加到click()事件?
  15. 计算机教程求和,电脑excel求和怎么操作步骤 | excel竖列自动求和sum
  16. 【BZOJ4094】[Usaco2013 Dec]Optimal Milking 线段树
  17. 网络基础设施的相对落后对于信息化社会的快速发展的影响
  18. 5G为人工智能与工业互联网赋能|79页高清PPT
  19. Excel作图太难看,掌握这7种酷炫可视化图表,老板直呼太牛了
  20. 源代码共享:C#操作数据库

热门文章

  1. 玩转Android之MVVM开发模式实战,炫酷的DataBinding!
  2. python语言是由谁设计并领导开发的_python语言概述 - osc_lt3ocv4d的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. oracle 经纬度算距离,根据经纬度诀别用java和Oracle存储过程计算两点距离
  4. Java bitset转string_将java BitSet保存到DB
  5. [转载] C++灵魂所在之---多态的前世与今生
  6. java timezone_Java TimeZone setID()方法与示例
  7. comparator比较器用法_汽车三元催化器堵塞咋办?不拆不换,用这招清理干净、动力猛如虎...
  8. python循环10次_开发一个循环 5 次计算的小游戏, 设置随机种子为10,每次随机产生两个 1~10的数字以及随机选择...
  9. _.uniq_在Ruby中使用Array.compact和Array.uniq方法从Array中移除元素
  10. strtolower_PHP strtolower()函数与示例