内网环境下,为了满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器,好多开发者希望有RTSP的技术方案,用于小并发场景,特别是在组网环境好的有线环境下,使用RTSP服务配合组播,是也是好多开发者考量的因素之一。
鉴于此,大牛直播SDK(Github)发布了轻量级RTSP服务,废话不多说,先上架构图:
轻量级RTSP服务功能支持
- [音频格式]AAC;
- [视频格式]H.264、H.265;
- [协议类型]RTSP;
- [传输模式]支持单播和组播模式;
- [端口设置]支持RTSP端口设置;
- [鉴权设置]支持RTSP鉴权用户名、密码设置;
- [获取session连接数]支持获取当前RTSP服务会话连接数;
- [多服务支持]支持同时创建多个内置RTSP服务;
- [H.265支持]Windows内置rtsp server支持发布H.265视频(64位库);
- [RTSP url回调]支持设置后的rtsp url通过event回调到上层。
单播不再赘述,这里重点介绍下我们的组播技术方案:
组播解决的主要痛点是服务器部署和带宽占用问题,一般来说,内网电子教室/无纸化/实时同屏场景用RTMP推送+RTMP服务器,然后其他端从服务器拉取RTMP流,这个方案的劣势在于,如果单独部署服务器,需要额外的机器,增加了成本开销,如果教师端机器作为服务器,网络和机器性能双重压力下,负荷过重。
通过组播技术方案,只要网络设备支持组播组网,轻松实现多并发的同屏/摄像头直播场景。
废话不多说,先上图:
大牛直播SDK组播方案开启如下:
1. 设置需要共享的视音频,设置码率后,点击“配置查看Rtsp服务”,选中“组播”和“SSM”选项,点击启动服务即可:
2. 确定后,返回主界面,点击“发布Rtsp流”,拷贝回调的RTSP url,用我们的SmartPlayer.exe或移动端播放器,播放即可。
注意:需要内网网络设备支持组播功能。
经长时间测试,毫秒级延迟,完全满足内网同屏技术指标,更重要的是,在组播同时,还可以同步支持内外网RTMP推送、RTSP推送和实时录像功能。
内置RTSP服务核心接口(以Windows C++ 接口为例:nt_smart_publisher_sdk.h):
/*+++rtsp server操作接口+++*/
/*
* 创建一个rtsp server
* pRtspServerHandle: rtsp server 句柄
* reserve:保留参数传0
* 成功返回 NT_ERC_OK
*/
NT_UINT32(NT_API *OpenRtspServer)(NT_PHANDLE pRtspServerHandle, NT_INT32 reserve);
/*
* 设置rtsp server 监听端口, 在StartRtspServer之前必须要设置端口
* rtsp_server_handle: rtsp server 句柄
* port: 端口号,可以设置为554,或者是1024到65535之间,其他值返回失败
* 成功返回 NT_ERC_OK
*/
NT_UINT32(NT_API *SetRtspServerPort)(NT_HANDLE rtsp_server_handle, NT_INT32 port);
/*
* 设置rtsp server 鉴权用户名和密码, 这个可以不设置,只有需要鉴权的再设置
* rtsp_server_handle: rtsp server 句柄
* user_name: 用户名,必须是英文
* password:密码,必须是英文
* 成功返回 NT_ERC_OK
*/
NT_UINT32(NT_API *SetRtspServerUserNamePassword)(NT_HANDLE rtsp_server_handle, NT_PCSTR user_name, NT_PCSTR password);
/*
* 设置rtsp server 组播, 如果server设置成组播就不能单播,组播和单播只能选一个, 一般来说单播网络设备支持的好,wifi组播很多路由器不支持
* rtsp_server_handle: rtsp server 句柄
* is_multicast: 是否组播, 1为组播, 0为单播, 其他值接口返回错误, 默认是单播
* 成功返回 NT_ERC_OK
*/
NT_UINT32(NT_API *SetRtspServerMulticast)(NT_HANDLE rtsp_server_handle, NT_INT32 is_multicast);
/*
* 设置rtsp server 组播组播地址
* rtsp_server_handle: rtsp server 句柄
* multicast_address: 组播地址
* 如果设置的不是组播地址, 将返回错误
* 组播地址范围说明: [224.0.0.0, 224.0.0.255] 为组播预留地址, 不能设置. 可设置范围为[224.0.1.0, 239.255.255.255], 其中SSM地址范围为[232.0.0.0, 232.255.255.255]
* 成功返回 NT_ERC_OK
*/
NT_UINT32(NT_API *SetRtspServerMulticastAddress)(NT_HANDLE rtsp_server_handle, NT_PCSTR multicast_address);
/*
* 获取rtsp server当前的客户会话数, 这个接口必须在StartRtspServer之后再调用
* rtsp_server_handle: rtsp server 句柄
* session_numbers: 会话数
* 成功返回 NT_ERC_OK
*/
NT_UINT32(NT_API *GetRtspServerClientSessionNumbers)(NT_HANDLE rtsp_server_handle, NT_INT32* session_numbers);
/*
* 启动rtsp server
* rtsp_server_handle: rtsp server 句柄
* reserve: 保留参数传0
* 成功返回 NT_ERC_OK
*/
NT_UINT32(NT_API *StartRtspServer)(NT_HANDLE rtsp_server_handle, NT_INT32 reserve);
/*
* 停止rtsp server
* rtsp_server_handle: rtsp server 句柄
* 成功返回 NT_ERC_OK
*/
NT_UINT32(NT_API *StopRtspServer)(NT_HANDLE rtsp_server_handle);
/*
* 关闭rtsp server
* 调用这个接口之后rtsp_server_handle失效,
* 成功返回 NT_ERC_OK
*/
NT_UINT32 (NT_API *CloseRtspServer)(NT_HANDLE rtsp_server_handle);
/*---rtsp server操作接口---*/
本文权当抛砖引玉,感兴趣的开发者,可以参考看看。