如何在Unity下采集音视频实现轻量级RTSP服务(类似于IPC)

好多开发者在做虚拟仿真、VR教育等场景的时候,遇到个问题,想把头显里面的画面在内网环境下低延迟的同步出来,又不想单独部署流媒体服务器。为此,我们在Unity下,添加了轻量级RTSP服务模块,通过头显端启动个轻量级RTSP服务,把采集到的音视频数据,通过对外提供RTSP拉流URL的形式,供内网其他终端调用,废话不多说,先上图看效果:

 上图展示的是,Android的Unity下Camera场景获取到texture数据编码后,注入RTSP服务和RTMP推送模块。二者可以单独使用,也可同时使用,相互不影响。其中轻量级RTSP服务,可实时查看链接的RTSP会话数。

由于我们原生Android平台轻量级RTSP服务已经有多年积累,本次只是把相关的接口,同步过来。

首先来看RTSP Server相关的接口设计:

  /** SmartPublisherAndroidMono.cs** Github: https://github.com/daniulive/SmarterStreaming*//*+++++++++++++++SmartRTSPServerSDK+++++++++++++++*//// <summary>/// Init rtsp server(和UnInitRtspServer配对使用,即便是启动多个RTSP服务,也只需调用一次InitRtspServer,请确保在OpenRtspServer之前调用)/// </summary>public int NT_PB_U3D_InitRtspServer(){return pusher_obj_.Call<int>("InitRtspServer");}/// <summary>/// 创建一个rtsp server/// </summary>public long NT_PB_U3D_OpenRtspServer(int reserve){return pusher_obj_.Call<long>("OpenRtspServer", reserve);}/// <summary>/// 设置rtsp server 监听端口, 在StartRtspServer之前必须要设置端口/// @param rtsp_server_handle: rtsp server 句柄/// @param port: 端口号,可以设置为554,或者是1024到65535之间,其他值返回失败/// </summary>public int NT_PB_U3D_SetRtspServerPort(long rtsp_server_handle, int port){return pusher_obj_.Call<int>("SetRtspServerPort", rtsp_server_handle, port);}/// <summary>/// 设置rtsp server 鉴权用户名和密码, 这个可以不设置,只有需要鉴权的再设置/// @param rtsp_server_handle: rtsp server 句柄/// @param user_name: 用户名(必须是英文), password:密码(必须是英文)/// </summary>public int NT_PB_U3D_SetRtspServerUserNamePassword(long rtsp_server_handle, String user_name, String password){return pusher_obj_.Call<int>("SetRtspServerUserNamePassword", rtsp_server_handle, user_name, password);}/// <summary>/// 设置rtsp server 组播, 如果server设置成组播就不能单播,组播和单播只能选一个, 一般来说单播网络设备支持的好,wifi组播很多路由器不支持/// @param rtsp_server_handle: rtsp server 句柄/// @param is_multicast: 是否组播, 1为组播, 0为单播, 其他值接口返回错误, 默认是单播/// </summary>public int NT_PB_U3D_SetRtspServerMulticast(long rtsp_server_handle, int is_multicast){return pusher_obj_.Call<int>("SetRtspServerMulticast", rtsp_server_handle, is_multicast);}/// <summary>/// 设置rtsp server 组播组播地址/// @param rtsp_server_handle: rtsp server 句柄/// 如果设置的不是组播地址, 将返回错误/// 组播地址范围说明: [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]/// </summary>public int NT_PB_U3D_SetRtspServerMulticastAddress(long rtsp_server_handle, String multicast_address){return pusher_obj_.Call<int>("SetRtspServerMulticastAddress", rtsp_server_handle, multicast_address);}/// <summary>/// 获取rtsp server当前的客户会话数, 这个接口必须在StartRtspServer之后再调用/// @param rtsp_server_handle: rtsp server 句柄/// @return {当前rtsp server会话数}/// </summary>public int NT_PB_U3D_GetRtspServerClientSessionNumbers(long rtsp_server_handle){return pusher_obj_.Call<int>("GetRtspServerClientSessionNumbers", rtsp_server_handle);}/// <summary>/// 启动rtsp server/// @param rtsp_server_handle: rtsp server 句柄/// @param reserve: 保留参数传0/// </summary>public int NT_PB_U3D_StartRtspServer(long rtsp_server_handle, int reserve){return pusher_obj_.Call<int>("StartRtspServer", rtsp_server_handle, reserve);}/// <summary>/// 停止rtsp server/// @param rtsp_server_handle: rtsp server 句柄/// </summary>public int NT_PB_U3D_StopRtspServer(long rtsp_server_handle){return pusher_obj_.Call<int>("StopRtspServer", rtsp_server_handle);}/// <summary>/// 关闭rtsp server/// @param rtsp_server_handle: rtsp server 句柄/// NOTE: 调用这个接口之后rtsp_server_handle失效,/// </summary>public int NT_PB_U3D_CloseRtspServer(long rtsp_server_handle){return pusher_obj_.Call<int>("CloseRtspServer", rtsp_server_handle);}/// <summary>/// UnInit rtsp server(和InitRtspServer配对使用,即便是启动多个RTSP服务,也只需调用一次UnInitRtspServer)/// </summary>public int NT_PB_U3D_UnInitRtspServer(){return pusher_obj_.Call<int>("UnInitRtspServer");}/*---------------SmartRTSPServerSDK---------------*/

其次是,用于publisher实例操作的接口,把publisher实例和rtsp实例串起来:

    /*+++++++++++++++SmartRTSPServerSDK供Publisher调用的接口+++++++++++++++*//// <summary>/// 设置rtsp的流名称/// @param handle: 推送实例句柄/// @param stream_name: 流程名称,不能为空字符串,必须是英文/// 这个作用是: 比如rtsp的url是:rtsp://192.168.0.111/test, test就是设置下去的stream_name/// </summary>public int NT_PB_U3D_SetRtspStreamName(long handle, String stream_name){return pusher_obj_.Call<int>("SetRtspStreamName", handle, stream_name);}/// <summary>/// 给要发布的rtsp流设置rtsp server, 一个流可以发布到多个rtsp server上,rtsp server的创建启动请参考OpenRtspServer和StartRtspServer接口/// @param handle: 推送实例句柄/// @param rtsp_server_handle:rtsp server句柄/// @param reserve:保留参数,传0/// </summary>public int NT_PB_U3D_AddRtspStreamServer(long handle, long rtsp_server_handle, int reserve){return pusher_obj_.Call<int>("AddRtspStreamServer", handle, rtsp_server_handle, reserve);}/// <summary>/// 清除设置的rtsp server/// @param handle: 推送实例句柄/// </summary>public int NT_PB_U3D_ClearRtspStreamServer(long handle){return pusher_obj_.Call<int>("ClearRtspStreamServer", handle);}/// <summary>/// 启动rtsp流/// @param handle: 推送实例句柄/// @param reserve: 保留参数,传0/// </summary>public int NT_PB_U3D_StartRtspStream(long handle, int reserve){return pusher_obj_.Call<int>("StartRtspStream", handle, reserve);}/// <summary>/// 停止rtsp流/// @param handle: 推送实例句柄/// </summary>public int NT_PB_U3D_StopRtspStream(long handle){return pusher_obj_.Call<int>("StopRtspStream", handle);}/*---------------SmartRTSPServerSDK供Publisher调用的接口---------------*/

Unity调用demo如下:

启动、停止轻量级服务:

    private void OnRtspServiceBtnClicked(){if (is_rtsp_service_running_) {StopRtspService();btn_rtsp_service_.GetComponentInChildren<Text>().text = "启动RTSP服务";btn_rtsp_publisher_.GetComponent<Button>().interactable = false;return;}rtsp_handle_ = NT_PB_U3D_OpenRtspServer(0);if (rtsp_handle_ == 0) {Debug.LogError("创建rtsp server实例失败! 请检查SDK有效性");} else {int port = 8554;if (NT_PB_U3D_SetRtspServerPort(rtsp_handle_, port) != 0) {NT_PB_U3D_CloseRtspServer(rtsp_handle_);rtsp_handle_ = 0;Debug.LogError("创建rtsp server端口失败! 请检查端口是否重复或者端口不在范围内!");}if (NT_PB_U3D_StartRtspServer(rtsp_handle_, 0) == DANIULIVE_RETURN_OK) {is_rtsp_service_running_ = true;Debug.Log("启动rtsp server 成功!");} else {NT_PB_U3D_CloseRtspServer(rtsp_handle_);rtsp_handle_ = 0;Debug.LogError("启动rtsp server失败! 请检查设置的端口是否被占用!");}btn_rtsp_service_.GetComponentInChildren<Text>().text = "停止RTSP服务";btn_rtsp_publisher_.GetComponent<Button>().interactable = true;}}

服务启动后,可以发布或停止RTSP流:

    private void OnRtspPublisherBtnClicked(){if (is_rtsp_publisher_running_) {StopRtspPublisher();if (!is_pushing_rtmp_){StopCaptureAvData();if (coroutine_ != null) {StopCoroutine(coroutine_);coroutine_ = null;}}btn_rtsp_publisher_.GetComponentInChildren<Text>().text = "发布RTSP流";btn_get_rtsp_session_numbers_.GetComponentInChildren<Text>().text = "RTSP会话数";btn_get_rtsp_session_numbers_.GetComponent<Button>().interactable = false;btn_rtsp_service_.GetComponent<Button>().interactable = true;input_url_.GetComponentInChildren<Text>().text = "";}else{bool is_started = StartRtspPublisher();if(is_started){btn_rtsp_publisher_.GetComponentInChildren<Text>().text = "停止RTSP流";btn_get_rtsp_session_numbers_.GetComponent<Button>().interactable = true;btn_rtsp_service_.GetComponent<Button>().interactable = false;if(!is_pushing_rtmp_){StartCaptureAvData();coroutine_ = StartCoroutine(OnPostVideo());}}}}

发布RTSP流:

    private bool StartRtspPublisher(){if (is_rtsp_publisher_running_){Debug.Log("已推送..");   return false;}if (!is_pushing_rtmp_) {InitAndSetConfig();}if (pusher_handle_ == 0) {Debug.LogError("Start rtsp publisher, pusher handle is null..");return false;}String rtsp_stream_name = "stream1";NT_PB_U3D_SetRtspStreamName(pusher_handle_, rtsp_stream_name);NT_PB_U3D_ClearRtspStreamServer(pusher_handle_);NT_PB_U3D_AddRtspStreamServer(pusher_handle_, rtsp_handle_, 0);int is_suc = NT_PB_U3D_StartRtspStream(pusher_handle_, 0);if (is_suc == DANIULIVE_RETURN_OK){Debug.Log("StartRtspStream success..");is_rtsp_publisher_running_ = true;}else{Debug.LogError("StartRtspStream failed!");return false;}return true;}

停止发布RTSP流:

    //停止发布RTSP流private void StopRtspPublisher() {if(!is_rtsp_publisher_running_)return;NT_PB_U3D_StopRtspStream(pusher_handle_);if(!is_pushing_rtmp_){NT_PB_U3D_Close(pusher_handle_);pusher_handle_ = 0;NT_PB_U3D_UnInit();}is_rtsp_publisher_running_ = false;}

发布RTSP流后,我们可以实时获取到链接的RTSP会话数:

    private void OnGetRtspSessionNumbersBtnClicked(){if (rtsp_handle_ != 0) {int session_numbers = NT_PB_U3D_GetRtspServerClientSessionNumbers(rtsp_handle_);Debug.Log("GetRtspSessionNumbers: " + session_numbers);btn_get_rtsp_session_numbers_.GetComponentInChildren<Text>().text = "RTSP会话数:" + session_numbers.ToString();}}

轻量级RTSP服务,由于不需要单独部署流媒体服务器,在内网小并发场景下,使用起来非常方便,感兴趣的开发者可酌情参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Datawhale 大模型基础】第十一章 环境影响

第十一章 环境影响 This blog is based on datawhale files and a paper. The initial consideration revolves around the potential positive or negative direct impact on the environment. Other transformative technological advancements, like the metaverse, are li…

Win7笔记本如何调整屏幕亮度

长期使用电脑的时候会因为视觉疲劳感觉屏幕亮度过高&#xff0c;需要对其调整来缓解。PC用户方法很简单&#xff0c;只需在显示器上点击按钮进行调整即可&#xff0c;那么Win7笔记本如何调整屏幕亮度?其实Win7系统本身有考虑到这个问题&#xff0c;在系统中有专门针对此问题的…

Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度

我们在做Android平台GB28181的时候&#xff0c;其中实时位置(MobilePosition)订阅和上报这块&#xff0c;涉及到实时经纬度的获取&#xff0c;特别是执法记录、车载系统的那个等场景&#xff0c;几乎就是标配。 今天主要是分享一段实时获取位置的代码&#xff1a; /** Camera…

Win7系统防火墙设置不了怎么办

防火墙是Windows系统中一项重要的防护措施&#xff0c;可以帮助你的电脑阻挡病毒和恶意软件&#xff0c;确保系统安全。近来有用户反馈win7系统的防火墙无法设置&#xff0c;Win7系统防火墙设置不了怎么办?无法设置说明系统设置被更改&#xff0c;防火墙功能应该是被禁用了&am…

如何实现Android平台GB28181设备对接Camera2数据

技术背景 在写如何实现Android平台GB28181设备对接Camera2数据说明之前&#xff0c;我在前两年的blog就有针对camera2的RTMP直播推送模块做过技术分享&#xff1a; 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用…

Win7性能信息和工具在哪打开

在Win7系统中&#xff0c;有一个性能信息和工具&#xff0c;我们可以通过这个功能中的高级工具&#xff0c;查看到关于系统的关键信息&#xff0c;全面了解系统的运行状况&#xff0c;不过&#xff0c;对于不熟悉电脑的用户来讲&#xff0c;可能连性能信息和工具在哪都不清楚&a…

Android平台实现mp4文件实时推送RTMP|轻量级RTSP服务|GB28181平台

好多开发者有这样的诉求&#xff0c;想把本地录制的MP4文件&#xff0c;以实时流数据的形式&#xff0c;推送到RTMP服务器&#xff0c;注入轻量级RTSP服务&#xff0c;或者对接到GB28181平台&#xff0c;这块前几年我们就有对接。 本次以MediaExtractor为例&#xff0c;先利用…

Win10系统字体太小的调整设置教程

Win7系统与Win10系统还是差别挺多的&#xff0c;一些小伙伴们刚开始使用Win10系统对很多功能都了解。有的小伙伴就遇到了不适应字体的大小&#xff0c;但是又不知道Win10字体太小怎么调整&#xff0c;下面告诉大家Win10系统字体太小的调整设置教程。 Win10系统字体太小的调整设…

Android平台GB28181设备接入端本地SIP端口被占用或屏蔽怎么办?

好多开发者或厂商&#xff0c;对Android平台GB28181接入模块的定位&#xff0c;大多是IPC国标流程打通模拟&#xff0c;基于这个目的&#xff0c;很难按照标准SPEC规范实现Android平台GB28181设备接入&#xff0c;我们在跟第三方国标平台厂商对接时发现&#xff0c;部分公司&am…

Android平台GB28181设备接入端如何实现本地录像?

实现Android平台GB28181设备接入的时候&#xff0c;有个功能点不可避免&#xff0c;那就是本地录像&#xff0c;实际上&#xff0c;在实现GB28181设备接入模块之前&#xff0c;我们前些年做RTMP推送和轻量级RTSP服务的时候&#xff0c;早已经实现了本地录像功能。 本地录像功能…

win10笔记本电脑合上屏幕休眠该怎么设置

现在很多用户经常外出的都喜欢轻便一点的电脑&#xff0c;所以这类人群为自己选择的电脑就会是笔记本电脑。使用笔记本电脑有一个特点就是如您合上电脑屏幕&#xff0c;它就会自动锁屏&#xff0c;那么win10笔记本电脑合上屏幕休眠该怎么设置呢?想要设置的用户一起来看看吧。 …

Android平台GB28181设备接入端实现实时快照

Android平台GB28181设计开发的时候&#xff0c;有个功能必不可少的&#xff1a;实时快照&#xff0c;特别是用于执法记录仪等场景下&#xff0c;用于图像留底或分析等考量。 实时快照的实现并不难&#xff0c;目前实现有两种方式&#xff0c;一种是拿到数据&#xff08;比如摄…

uc浏览器怎么看历史记录 uc浏览器网页历史记录查看方法

很多用户发现UC浏览器的历史记录查看不了&#xff0c;怎么找也找不到&#xff0c;不要急&#xff0c;它只是换了个位置而已&#xff0c;那么下面小编就来跟大家说一说UC浏览器网页历史记录查看方法。 方法一&#xff1a;点击右上角的UC图标&#xff0c;在弹出来的菜单中你就会…

Win11如何跳过开机更新 Win11跳过开机更新教程

已经有很多用户更新升级到win11系统了吧&#xff0c;但是有用户发现偶尔开机会出现自动更新&#xff0c;导致无法及时开机使用&#xff0c;那win11统如何跳过开机更新呢?可以先使用电源键取消这次更新&#xff0c;然后进入系统取消更新检测就可以了。 win11怎么跳过开机更新&…

Android国标接入端如何播放GB28181平台端语音广播数据

GB28181语音广播这块&#xff0c;我们依据GB/T28181-2016针对流程和实例代码&#xff0c;做过详细的描述&#xff0c;本次主要是探讨下&#xff0c;广播数据过来后&#xff0c;如何处理。 鉴于我们之前有非常成熟的RTMP|RTSP低延迟播放模块&#xff0c;语音广播数据过来后&…

Win11和Win10有什么区别 Win11和Win10区别对比

Win11是微软全新一代操作系统&#xff0c;在界面和功能上和Win10相比还是有不少区别的&#xff0c;如果你还在犹豫要不要升级Win11的话&#xff0c;那么不妨来看看Win11和Win10之间有哪些区别吧。 1、 开始菜单&#xff1a;简单的图标&#xff0c;没有动态磁贴 Windows 11 的…

Android平台RTSP、RTMP播放端如何实现YUV或ARGB数据按设定角度旋转

做音视频RTSP或RTMP直播播放器的时候&#xff0c;不免会遇到这样的诉求&#xff0c;实时播放或快照的时候&#xff0c;由于前端摄像头安装角度不一定是正向&#xff0c;导致播放或快照的时候&#xff0c;视频view显示的画面是呈90 180甚至270旋转的。 以Android平台为例&#…

Win11任务栏颜色如何更改 Win11更改任务栏颜色教程

win11系统中任务栏颜色默认为浅蓝色&#xff0c;有用户认为它可能会与白色的网页或界面重叠&#xff0c;影响自己的操作&#xff0c;想问问有没有什么方法可以更改任务栏的颜色。可以通过更改主题或者更改深色浅色模式来更改任务栏的颜色&#xff0c;将其调整为自己喜欢的颜色。…

国网B接口注册(REGISTER)接口描述和消息示例

技术背景 电网视频监控系统是智能电网的一个重要组成部分&#xff0c;广泛应用于电网的建设、生产、运行、经营等方面。由于视频监控系统在不同的建设时期选用了不同的技术和不同厂家的产品&#xff0c;导致了标准不统一、技术路线不一致。目前国家电网公司智能电网建设&#…

Win7系统怎么设置虚拟内存

我们在日常生活中使用电脑的时候&#xff0c;有时候会以你为系统内存不足导致系统崩溃&#xff0c;甚至严重的还会导致电脑死机。电脑内存不足的时候&#xff0c;那么Win7系统怎么设置虚拟内存呢?如果您不会设置虚拟内存的话&#xff0c;就让小编来教教你Win7系统设置虚拟内存…