Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?

简介: Android平台轻量级RTSP服务模块如何实现一个服务发布多路RTSP流?

我们在做Android平台轻量级RTSP服务和内网RTSP网关的时候,遇到过这样的问题,如何同时发布多路RTSP流出去?

回答这个问题,实际上不难,大牛直播SDK在设计这个模块的时候,考虑到了一个Service带多路流的情况,以下是大概的技术实现:

启动RTSP服务:

启动RTSP服务的时候,你可以注意到OpenRtspServer()会返回rtsp_handle_,这个句柄对应一个RTSP Service。

classButtonRtspServiceListenerimplementsOnClickListener {
publicvoidonClick(Viewv) {
if (isRTSPServiceRunning) {
stopRtspService();
btnRtspService.setText("启动RTSP服务");
btnRtspPublisher.setEnabled(false);
isRTSPServiceRunning=false;
return;
            }
if(!OpenPushHandle())
            {
return;
            }
Log.i(TAG, "onClick start rtsp service..");
rtsp_handle_=libPublisher.OpenRtspServer(0);
if (rtsp_handle_==0) {
Log.e(TAG, "创建rtsp server实例失败! 请检查SDK有效性");
            } else {
intport=8554;
if (libPublisher.SetRtspServerPort(rtsp_handle_, port) !=0) {
libPublisher.CloseRtspServer(rtsp_handle_);
rtsp_handle_=0;
Log.e(TAG, "创建rtsp server端口失败! 请检查端口是否重复或者端口不在范围内!");
                }
//String user_name = "admin";//String password = "12345";//libPublisher.SetRtspServerUserNamePassword(rtsp_handle_, user_name, password);if (libPublisher.StartRtspServer(rtsp_handle_, 0) ==0) {
Log.i(TAG, "启动rtsp server 成功!");
                } else {
libPublisher.CloseRtspServer(rtsp_handle_);
rtsp_handle_=0;
Log.e(TAG, "启动rtsp server失败! 请检查设置的端口是否被占用!");
                }
btnRtspService.setText("停止RTSP服务");
btnRtspPublisher.setEnabled(true);
isRTSPServiceRunning=true;
            }
        }
    }

如何停止这个RTSP服务?

//发布/停止RTSP流classButtonRtspPublisherListenerimplementsOnClickListener {
publicvoidonClick(Viewv) {
if (isRTSPPublisherRunning) {
stopRtspPublisher();
btnRtspPublisher.setText("发布RTSP流");
btnGetRtspSessionNumbers.setEnabled(false);
btnRtspService.setEnabled(true);
            }
else            {
Log.i(TAG, "onClick start rtsp publisher..");
booleanstartRet=StartRtspStream();
if (!startRet) {
Log.e(TAG, "Failed to call StartRtspStream().");
return;
                }
btnRtspPublisher.setText("停止RTSP流");
btnGetRtspSessionNumbers.setEnabled(true);
btnRtspService.setEnabled(false);
            }
        }
    };

如何启动一个服务,发布多个RTSP流(对应不同的数据源和RTSP拉流URL)?

实际上,只要确保,每个发布的RTSP流,对应一个publisherHandle,音视频数据投递,也是传递这个publisherHandle。

privatebooleanStartRtspStream(longpublisherHandle, Stringrtsp_stream_name)
    {
if (isRTSPPublisherRunning)
returnfalse;
libPublisher.SetRtspStreamName(publisherHandle, rtsp_stream_name);
libPublisher.AddRtspStreamServer(publisherHandle, rtsp_handle_, 0);
if (libPublisher.StartRtspStream(publisherHandle, 0) !=0)
        {
Log.e(TAG, "调用发布rtsp流接口失败!");
if (!isPushing)
            {
libPublisher.SmartPublisherClose(publisherHandle);
publisherHandle=0;
            }
returnfalse;
        }
isRTSPPublisherRunning=true;
returntrue;
    }

停止发布RTSP流:

//停止发布RTSP流privatevoidstopRtspPublisher(longpublisherHandle)
    {
if(!isRTSPPublisherRunning)
return;
isRTSPPublisherRunning=false;
if (null==libPublisher||0==publisherHandle)
return;
libPublisher.StopRtspStream(publisherHandle);
if (!isPushing&&!isRTSPServiceRunning)
        {
releasePublisherHandle();
        }
    }

每一路发布的RTSP流,都对应一个event回调,回上来外部可以拉流的RTSP URL:

classEventHandlePublisherV2implementsNTSmartEventCallbackV2 {
@OverridepublicvoidonNTSmartEventCallbackV2(longhandle, intid, longparam1, longparam2, Stringparam3, Stringparam4, Objectparam5) {
Log.i(TAG, "EventHandlePublisherV2: handle="+handle+" id:"+id);
Stringpublisher_event="";
switch (id) {
                ...
caseNTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_RTSP_URL:
publisher_event="RTSP服务URL: "+param3;
break;
        ...
            }
        }
    }

如果需要获取单个Service的会话链接数:

//获取RTSP会话数classButtonGetRtspSessionNumbersListenerimplementsOnClickListener {
publicvoidonClick(Viewv) {
if (libPublisher!=null&&rtsp_handle_!=0) {
intsession_numbers=libPublisher.GetRtspServerClientSessionNumbers(rtsp_handle_);
Log.i(TAG, "GetRtspSessionNumbers: "+session_numbers);
PopRtspSessionNumberDialog(session_numbers);
            }
        }
    };

以上是大概的设计思路,感兴趣的开发者可以参考。

相关文章
|
9天前
|
安全 Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的深度对比
在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文旨在通过数据驱动的分析方法,深入探讨这两大操作系统在开发环境、用户界面设计及市场表现等方面的差异。引用最新的行业报告和科研数据,结合技术专家的观点,本文将提供对开发者和市场分析师均有价值的洞见。
|
12天前
|
Java 开发工具 Android开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发过程中的关键差异点,包括编程语言、开发工具、用户界面设计、性能优化以及市场覆盖等方面。通过对这些关键因素的比较分析,旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和目标受众做出明智的平台选择。
|
11天前
|
监控 Android开发 iOS开发
探索Android与iOS开发的差异:平台、工具和用户体验的比较
【6月更文挑战第25天】在移动应用开发的广阔天地中,Android和iOS两大平台各领风骚,它们在开发环境、工具选择及用户体验设计上展现出独特的风貌。本文将深入探讨这两个操作系统在技术实现、市场定位和用户交互方面的关键差异,旨在为开发者提供一个全景式的视图,帮助他们在面对项目决策时能够更加明智地选择适合自己项目需求的平台。
|
20天前
|
存储 监控 调度
Android系统服务:WMS、AMS相关知识
参考文献 Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析 Android窗口管理服务WindowManagerService显示Activity组件的启动窗口(Starting Window)的过程分析 Android窗口管理服务WindowManagerService对输入法窗口(Input Method Window)的管理分析 Android窗口管理服务WindowManagerService显示窗口动画的原理分析
|
18天前
|
Java Android开发 Swift
探索Android与iOS开发的差异:平台选择对项目成功的影响
【6月更文挑战第18天】在移动应用开发的广阔天地中,Android和iOS两大平台各据一方,它们在市场份额、用户群体及开发环境上各有千秋。本文将深入分析这两个操作系统的开发差异,探讨如何根据项目需求选择合适的平台,并讨论跨平台解决方案的可行性与挑战。我们将通过实际案例,揭示平台选择对项目成功的关键性影响,为开发者提供决策支持。
|
19天前
|
安全 IDE Android开发
探索Android与iOS开发的差异:平台特性与编程实践
【6月更文挑战第17天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据半壁江山。它们在用户群体、系统架构以及开发环境上的差异,为开发者带来了不同的挑战和机遇。本文深入探讨了这两个平台在技术实现、界面设计、性能优化等方面的主要区别,并提供了实用的开发建议,旨在帮助开发者更好地理解各自平台的特性,从而创造出更加优秀的移动应用。
|
3天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与创新潜力
在移动应用开发的广阔天地中,安卓和iOS两大平台各占据一方。本文深入剖析了这两个操作系统的开发环境、工具、语言及市场趋势,旨在为开发者提供一个全面的比较视角。文章将基于最新的行业报告、技术论坛讨论以及专家分析,详细阐述两个平台的技术架构差异、开发成本和用户体验设计的不同点。通过数据支持的论证,揭示安卓与iOS在创新潜力上的独特优势,并探讨它们如何塑造未来的移动应用生态。
5 0
|
7天前
|
Java Linux Android开发
详细解读android6.0SerialPort服务
详细解读android6.0SerialPort服务
|
16天前
|
Java Linux API
微信API:探究Android平台下Hook技术的比较与应用场景分析
微信API:探究Android平台下Hook技术的比较与应用场景分析
|
16天前
|
安全 Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的对比分析
移动应用开发的两大阵营——安卓与iOS,各自拥有独特的开发环境、用户群体和市场定位。本文将深入探讨这两个操作系统在应用开发过程中的主要差异,包括编程语言、开发工具、用户界面设计、性能优化、安全性考量以及发布流程等方面。通过比较分析,旨在为开发者提供跨平台开发的见解和策略,以优化应用性能和提升用户体验。
14 0

热门文章

最新文章