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

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

好多开发者认为,无论是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_;                              // 设置一个录像文件名前缀, 例如:daniulive
        public Int32 append_date_;                                    // 如果是1的话,将在文件名上加日期, 例如:daniulive-2017-01-17
        public 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文件通用性更好。

总结

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


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

相关文章
rtsp推流
rtsp推流
666 0
|
Linux Android开发 编解码
VLC播放RTSP视频延迟问题
之前写过一篇关于在Linux平台上编译Android平台上VLC播放器源代码的文章,vlc这款播放器非常优秀而且是开源的,它的核心是开源视频编解码库ffmpeg。而且这款播放器还支持RTSP协议,这个主要是用开源的live555来实现的,live555这个库以后还需要认真研习。
4986 0
|
3月前
|
编解码 Linux 开发工具
iOS平台如何实现RTSP|RTMP播放端录像?
我们在做RTSP、RTMP直播播放器的时候,有个比较重要的功能,就是拉流端实时录像,包括设置单个录像文件大小、文件前缀、audio转AAC、只录制视频或只录制音频、开始录像、停止录像事件状态回调等。
|
3月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
|
3月前
|
Linux 开发工具 图形学
Unity下实现跨平台的RTMP推流|轻量级RTSP服务|RTMP播放|RTSP播放低延迟解决方案
自2018年起,我们成功实现了Unity环境下的低延迟RTSP|RTMP播放,达到毫秒级延迟,获得业界广泛认可。现已覆盖Windows、Android、iOS与Linux平台的RTMP推送、轻量级RTSP服务及RTSP|RTMP播放。通过高效采集Unity窗口或摄像头数据,并利用原生SDK进行编码与推送,确保了数据传输的高速性。此外,播放器支持多路视频同时播放,适应不同分辨率,并保持长时间运行稳定。更多技术细节和技术博文,请参考相关链接。
217 1
|
3月前
|
XML 监控 C#
Windows平台C#版RTSP转RTMP直播推送定制版
前几年我们发布了C++版的多路RTMP/RTSP转RTMP转发官方定制版。在秉承低延迟、灵活稳定、低资源占用的前提下,客户无需关注开发细节,只需图形化配置转发等各类参数,实现产品快速上线目的。如监控类摄像机、NVR等,通过厂商说明或Onvif工具,获取拉流的RTSP地址,图形化配置,完成拉流转发等操作,轻松实现标准RTMP服务器对接。
|
3月前
|
存储 编解码 开发工具
拉取RTSP流后的几个去向探讨(播放|转RTMP|轻量级RTSP服务|本地录制|GB28181)
本文汇总了大牛直播SDK在Android平台上拉取RTSP流后的多种应用方向,包括本地播放、转推至RTMP服务器、轻量级RTSP服务、GB28181平台及录像等功能。提供了详细的实现方法与示例代码,旨在帮助开发者高效利用RTSP流数据,实现低延迟、稳定且灵活的应用场景。
|
编解码 开发工具 Android开发
rtmp/rtsp直播播放器选择
相信大家在做rtmp、rtsp直播的时候,最大的困惑就是选个靠谱的播放器,直播的延迟,一定意义上说,90%的取决于播放器的好坏。
270 0
|
编解码 监控 开发工具
RTMP/RTSP直播播放器的几种选择
播放网络视频,通常解析库我们可以有多个选择,如FFMPEG,Daniulive SDK 或者 vitamio。
259 1
|
Linux 开发工具 图形学
Unity下如何实现RTMP或RTSP播放端录像?
Unity下如何实现RTMP或RTSP播放端录像?
264 0