一种插件加载的方法和装置转让专利

申请号 : CN201710930088.0

文献号 : CN107678801B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 杨亮陈少杰张文明

申请人 : 武汉斗鱼网络科技有限公司

摘要 :

本发明实施例提供了一种插件加载的方法和装置,至少用于解决现有技术存在的如何提高主播端直播程序运行稳定性的技术问题。所述方法包括:启动主播端直播应用程序;获取所述主播端直播应用程序的主控进程;所述主控进程创建插件加载进程;所述插件加载进程在所述插件加载进程中加载需要在所述直播应用程序中加载的目标插件。

权利要求 :

1.一种插件加载的方法,其特征在于,包括:启动主播端直播应用程序;

获取所述主播端直播应用程序的主控进程;

所述主控进程创建插件加载进程;

所述主控进程创建插件枚举器进程;

所述插件枚举器进程向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件;

所述主控进程确定从所述备选插件中确定出目标插件,并通知所述插件加载进程加载所述目标插件;

所述插件加载进程在所述插件加载进程中加载需要在所述直播应用程序中加载的目标插件;

其中,所述主控进程创建插件枚举器进程,包括:所述主控进程调用进程创建函数;

所述主控进程将所述主控进程的ID传入所述进程创建函数;

所述主控进程运行所述进程创建函数创建所述插件枚举器进程,所述插件枚举器进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。

2.如权利要求1所述的方法,其特征在于,所述插件枚举器进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程,包括:在所述插件枚举器进程中注册枚举插件函数和枚举退出函数;

获取所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。

3.如权利要求2所述的方法,其特征在于,所述插件枚举器进程向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件,包括:所述插件枚举器接收所述主控进程发送的枚举指令,调用所述枚举插件函数进程读取所述加载目录下的所有插件;

从所有的所述插件中过滤出合法插件;

从所述合法插件中过滤出所述主播端直播应用程序支持的所述备选插件。

4.如权利要求3所述的方法,其特征在于,在所述插件枚举器进程向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件之后,还包括:所述主控进程向所述插件枚举器进程发送退出指令;

所述插件枚举器基于所述退出指令调用所述枚举退出函数结束进程。

5.如权利要求1所述的方法,其特征在于,所述方法还包括:所述主控进程监控所述插件加载进程是否崩溃;

如果所述主控进程监控到所述插件加载进程崩溃,重新创建所述插件加载进程。

6.一种插件加载的装置,其特征在于,包括:启动单元,用于启动主播端直播应用程序;

主控进程获取单元,用于获取所述主播端直播应用程序的主控进程;

进程创建单元,用于创建插件加载进程和插件枚举器进程;

插件枚举单元,用于向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件;

确定单元,用于确定从所述备选插件中确定出目标插件,并通知所述插件加载进程加载所述目标插件;

插件加载单元,用于在所述插件加载进程中加载需要在所述直播应用程序中加载的目标插件;

其中,所述进程创建单元创建插件枚举器进程,包括调用进程创建函数,将主控进程的ID传入进程创建函数,运行所述进程创建函数创建所述插件枚举器进程,所述插件枚举器进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。

7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1-5任一项所述方法的步骤。

8.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1-5任一项所述方法的步骤。

说明书 :

一种插件加载的方法和装置

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及一种插件加载的方法和装置。

背景技术

[0002] 网络直播已经逐渐成为现代生活一种主流的娱乐和交流方式。纵观目前各个平台的主播端直播应用程序,乃至其他类型的应用程序,都是采用单进程模式运行的,即,程序所有的功能都集成在一个进程中执行。
[0003] 尽管单进程模式具有架构简单、方便维护的优点,但是却存在稳定性低的问题,例如如果某插件出现问题,就可能导致整个进程崩溃,必须通过重启程序才能解决。
[0004] 因此,现有技术存在如何提高主播端直播程序运行稳定性的技术问题。

发明内容

[0005] 本发明实施例提供了一种插件加载的方法和装置,至少用于解决现有技术存在的如何提高主播端直播程序运行稳定性的技术问题。
[0006] 第一方面,本发明提供了一种插件加载的方法,包括:
[0007] 启动主播端直播应用程序;
[0008] 获取所述主播端直播应用程序的主控进程;
[0009] 所述主控进程创建插件加载进程;
[0010] 所述插件加载进程在所述插件加载进程中加载需要在所述直播应用程序中加载的目标插件。
[0011] 可选的,在所述插件加载进程在所述插件加载进程中加载需要在所述直播应用程序中加载的目标插件之前,还包括:
[0012] 所述主控进程创建插件枚举器进程;
[0013] 所述插件枚举器进程向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件;
[0014] 所述主控进程确定从所述备选插件中确定出所述目标插件,并通知所述插件加载进程所述目标插件。
[0015] 可选的,所述主控进程创建插件枚举器进程,包括:
[0016] 所述主控进程调用进程创建函数;
[0017] 所述主控进程将所述主控进程的ID传入所述进程创建函数;
[0018] 所述主控进程运行所述进程创建函数创建所述插件枚举器进程,所述插件枚举器进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0019] 可选的,所述插件枚举器进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程,包括:
[0020] 在所述插件枚举器进程中注册枚举插件函数和枚举退出函数;
[0021] 获取所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0022] 可选的,所述插件枚举器进程向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件,包括:
[0023] 所述插件枚举器接收所述主控进程发送的枚举指令,调用所述枚举插件函数进程读取所述加载目录下的所有插件;
[0024] 从所有的所述插件中过滤出合法插件;
[0025] 从所述合法插件中过滤出所述主播端直播应用程序支持的所述备用插件。
[0026] 可选的,在所述插件枚举器进程向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件之后,还包括:
[0027] 所述主控进程向所述插件枚举器进程发送退出指令;
[0028] 所述插件枚举器基于所述退出指令调用所述枚举退出函数结束进程。
[0029] 可选的,所述方法还包括:
[0030] 所述主控进程监控所述插件加载进程是否崩溃;
[0031] 如果所述主控进程监控到所述插件加载进程崩溃,重新创建所述插件加载进程。
[0032] 第二方面,本发明提供了一种插件加载的装置,包括:
[0033] 启动单元,用于启动主播端直播应用程序;
[0034] 主控进程获取单元,用于获取所述主播端直播应用程序的主控进程;
[0035] 进程创建单元,用于创建插件加载进程;
[0036] 插件加载单元,用于在所述插件加载进程中加载需要在所述直播应用程序中加载的目标插件。
[0037] 可选的,所述进程创建单元还用于在所述插件加载进程中加载需要在所述直播应用程序中加载的目标插件之前,创建插件枚举器进程;
[0038] 所述装置还包括插件枚举单元,用于向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件;
[0039] 确定单元,用于确定从所述备选插件中确定出所述目标插件,并通知所述插件加载进程所述目标插件。
[0040] 可选的,所述进程创建单元用于调用进程创建函数,将所述主控进程的ID传入所述进程创建函数,运行所述进程创建函数创建所述插件枚举器进程,所述插件枚举器进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0041] 可选的,所述装置还包括插件加载进程环境初始单元,用于在所述插件枚举器进程创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程,具体用于在所述插件枚举器进程中注册枚举插件函数和枚举退出函数,获取所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0042] 可选的,所述插件枚举单元用于接收所述主控进程发送的枚举指令,调用所述枚举插件函数进程读取所述加载目录下的所有插件;从所有的所述插件中过滤出合法插件;从所述合法插件中过滤出所述主播端直播应用程序支持的所述备用插件。
[0043] 可选的,所述装置还包括退出单元,用于在所述插件枚举器进程向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件之后,向所述插件枚举器进程发送退出指令,基于所述退出指令调用所述枚举退出函数结束进程。
[0044] 可选的,所述装置还包括插件加载进程监控单元,用于监控所述插件加载进程是否崩溃,如果监控到所述插件加载进程崩溃,重新创建所述插件加载进程。
[0045] 第三方面,本发明提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面任一项所述方法的步骤。
[0046] 第四方面,本发明提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面任一项所述方法的步骤。
[0047] 本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:
[0048] 在本发明实施例的技术方案中,首先启动主播端直播应用程序,并获取主播端直播应用程序的主控进程,然后主控进程进一步创建插件加载进程,并在插件加载进程中加载需要在直播应用程序中加载的目标插件。由于本发明实施例采用多进程,利用插件加载进程加载插件,故而插件功能的异常不会影响主控进程,所以避免了由于一个或多个功能异常而导致程序崩溃,使得主播端直播应用程序更稳定地运行,由此解决了现有技术存在的如何提高主播端直播程序运行稳定性的技术问题。

附图说明

[0049] 图1为本发明实施例中直播的方法流程图;
[0050] 图2为本发明实施例中直播的装置结构示意图;
[0051] 图3为本发明实施例中计算机设备的结构示意图。

具体实施方式

[0052] 本发明实施例提供了一种插件加载的方法和装置,至少用于解决现有技术存在的如何提高主播端直播程序运行稳定性的技术问题。
[0053] 为了解决上述技术问题,本发明提供的技术方案思路如下:
[0054] 在本发明实施例的技术方案中,首先启动主播端直播应用程序,并获取主播端直播应用程序的主控进程,然后主控进程进一步创建插件加载进程,并在插件加载进程中加载需要在直播应用程序中加载的目标插件。由于本发明实施例采用多进程,利用插件加载进程加载插件,故而插件功能的异常不会影响主控进程,所以避免了由于一个或多个功能异常而导致程序崩溃,使得主播端直播应用程序更稳定地运行,由此解决了现有技术存在的如何提高主播端直播程序运行稳定性的技术问题。
[0055] 下面通过附图以及具体实施例对本发明技术方案做详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互组合。
[0056] 本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
[0057] 本发明第一方面提供了一种直播的方法,请参考图1,为本发明实施例中直播的方法流程图。该方法包括:
[0058] S101:启动主播端直播应用程序;
[0059] S102:获取所述主播端直播应用程序的主控进程;
[0060] S103:所述主控进程创建编码进程和/或插件加载进程,所述编码进程用于基于所述主控进程的控制编码出视频流,并向所述主控进程反馈所述视频流,所述插件加载进程用于在所述插件加载进程中加载插件,并根据所述主控进程的控制调用加载的插件;
[0061] S104:所述主控进程获取所述视频流;
[0062] S105:所述主控进程将所述视频流发送至直播服务器,以使所述直播服务器将所述视频流转发给接入所述直播服务器的观众端设备。
[0063] 具体来讲,在S101中启动主播端直播应用程序。在具体实现过程中,主播端直播应用程序可以安装在手机、平板电脑或台式电脑等主播端设备上的直播应用,本发明不做具体限制。为了方便介绍本发明实施例中的技术方案,下文将以安装在Windows系统的台式电脑上的主播端直播应用程序为例来进行介绍。
[0064] 在S102中,随着主播端直播应用程序的启动,相应创建主播端直播应用程序的主控进程。接下来,在S103中,主控进程将按照需要创建编码进程和/或插件加载进程。
[0065] 具体来讲,本发明实施例中的编码进程用于基于主控进程的控制编码出视频流,并向主控进程反馈视频流。更具体地,编码进程接收主控进程的初始化命令和编码命令进行初始化和编码,并将编码后的数据传递给主控进程。
[0066] 插件加载进程用于在插件加载进程中加载插件,并根据主控进程的控制调用加载的插件。更具体地,插件加载进程充当主播端直播应用程序插件的装载器,将原有的要加载进主控进程中的插件加载到插件加载进程中,进而使主控进程不再需要加载插件,进而避免了因为插件的问题导致主控进程崩溃的情况。本发明实施例中的插件加载进程一方面模拟出插件加载和运行所依赖的主控进程的环境,另一方面响应来自主控进程获取图像、获取音频等命令,向主控进程反馈插件生成的图像和音频,使主控进程中可以正常绘制来自插件的图像以及播放声音。
[0067] 主控进程是主播端直播应用程序的主进程,管理插件加载进程和编码进程。并且,如果监控到编码进程异常退出,主控进程将自动重新创建编码进程,使得编码进程能够快速的重启。
[0068] 进一步,由于主控进程、编码进程和插件加载进程为不同的进程,为了使多条进程协同提供主播端直播应用程序的各种服务,进程间通过进程通信的方式进行交互。进程通信的方式包括RPC(远程过程调用协议,Remote Procedure Call Protocol)和命名管道等等,本发明不做具体限制,本发明所属领域的普通技术人员可以根据实际进行选择。后文中则以RPC为例来进行介绍。
[0069] 对于本发明实施例中的主播端直播应用程序而言,主控进程、编码进程和插件加载进程运行于后台,在前台则通过界面程序与主播交互。界面程序为主播真正进行人机交互的程序,在实现上,界面程序需要将视频画面预览窗口交给主控进程来绘制。主播在界面上的调用会通过RPC转发到主控进程中处理。并且,界面程序还需在主控进程异常崩溃的情况下,启动和恢复主控进程。
[0070] 以上是对本发明多进程模式中每个进程的介绍。在具体实现过程中,在不同的情况下主播可能有不同的需求,例如主播为了便于维护可能倾会使用单进程模式,或者为了程序温度会使用多进程模式,以及在不需要使用插件的情况下会不创建插件加载进程等,为了满足不同的需求,本发明实施例中的主播端直播应用程序可以按照至少以下4种运行模式运行。
[0071] 第一模式:
[0072] 第一模式LIVE_ENCODER_PROXY_WITH_SERVER具体为多进程模式。在第一模式下,主播端直播应用程序启动后将创建主控进程RpcLiveEncoderServer(主控进程也可以命名为其他),然后主播端直播应用程序会将主控进程RpcLiveEncoderServer视为服务器,以客户端的身份接入主控进程RpcLiveEncoderServer。然后,主播端直播应用程序对主控进程的调用,会通过RPC请求发送给主控进程RpcLiveEncoderServer。
[0073] 在第一模式下,主控进程RpcLiveEncoderServer会进一步创建编码进程RpcLiveEncoderEncoder(编码进程的命名也可以为其他)和插件加载进程RpcPluginLoader(插件加载进程的命名也可以为其他)。
[0074] 第二模式:
[0075] 第二模式LIVE_ENCODER_PROXY_WITHOUT_SERVER也为多进程模式。与第一模式不同的是 ,在第二模式下主播端直播应用程序不需要自行创建主控进程RpcLiveEncoderServer,而是连接到一个已有的预设主控进程中。类似地,主播端直播应用程序会将主控进程RpcLiveEncoderServer视为服务器,根据服务器的地址以客户端的身份接入预设的主控进程。
[0076] 在具体实现过程中,第二模式中的主控进程可以为上层应用创建的进程。第二模式相较于第一模式,优势在于便于从上层应用扩展主控进程;第一模式相较于第二模式,优势在于便于主播端直播应用程序直接管理主控进程,并且主控进程是由主播端应用程序自己创建的,因此不兼容的可能性低。
[0077] 在第二模式下,主控进程RpcLiveEncoderServer也会进一步创建编码进程RpcLiveEncoderEncoder和插件加载进程RpcPluginLoader。
[0078] 第三模式:
[0079] 第三模式LIVE_ENCODER_PROXY_STUB也为多进程模式。其中,第三模式中的主控进程RpcLiveEncoderServer类似于第一模式或第二模式中的主控进程。在第三模式下,主控进程RpcLiveEncoderServer进一步会创建编码进程RpcLiveEncoderServer或插件加载进程RpcPluginLoader中的一个。在本发明实施例中,通过预先设置标记位来指示主控进程RpcLiveEncoderServer生成编码进程RpcLiveEncoderServer还是插件加载进程RpcPluginLoader。
[0080] 具体来讲,第一标记位LIVE_ENCODER_REMOTE_PLUGIN表示需要创建插件加载进程RpcPluginLoader,第二标记位LIVE_ENCODER_REMOTE_ENCODER表示需要创建编码进程RpcLiveEncoderServer。
[0081] 那么,在具体实现过程中,如果需要添加插件,并且降低插件对主控进程的影响,则可以选择第三模式,且预先设置第一标记位;如果需要单独进程编码,避免编码功能对主控进程影响,且不需要添加插件时,则可以选择第三模式,且预先设置第二标记位。
[0082] 第四模式:
[0083] 第四模式LIVE_ENCODER_LOCAL_SERVICE为单进程模式。在第四模式下,主播端直播应用程序仅创建一个进程,即主控进程。主播端直播应用的编码功能在主控进程中实现,插件也加载在主控进程中。
[0084] 在第四模式下,主控进程RpcLiveEncoderServer不会进一步创建其他进程。
[0085] 基于以上对四种运行模式的介绍,可以看出主播端直播应用程序在不同运行模式下将按照不同的方式获取主控进程,因此本发明实施例中的S102具体通过如下过程实现:
[0086] 判断预先设置的所述主播端直播应用程序的运行模式;
[0087] 如果所述运行模式为第一模式,创建所述主播端直播应用程序的所述主控进程,其中,在所述第一模式下,所述主控进程将创建所述编码进程和所述插件加载进程;
[0088] 如果所述运行模式为第二模式,获取预设的所述主控进程的地址,并基于所述地址接入所述主控进程,其中,在所述第二模式下,所述主控进程将创建所述编码进程和所述插件加载进程。
[0089] 具体来讲,首先判断预先设置的运行模式为以上四种模式中的哪一种。如果主播设置的运行模式为第一模式,则由主播端直播应用程序创建出主控进程;如果主播设置的运行模式为第二模式,则主播端直播应用程序获取预设的主控进程的地址,然后基于该地址接入预设的主控进程。并且,在第一模式和第二模式下,获取到的主控进程将进一步创建编码进程和插件加载进程。
[0090] 另外,如果主播设置的运行模式为第四模式,则主播端直播应用程序仅创建主控进程一条进程,以单进程模式运行。如果主播设置的运行模式为第三模式,则主播端直播应用程序获取主控进程后,主控进程进一步还需创建编码进程或插件加载进程中的一个进程。具体地,S103之前还包括:判断预先设置的主播端直播应用程序的运行模式,如果运行模式为第三模式,则进一步获取表示需要创建编码进程或插件加载进程的标记位,如果标记位为第一标记位,S103具体为:通过主控进程创建插件加载进程;如果标记位为第二标记位,S103具体为:通过主控进程创建编码进程。
[0091] 由上述描述可以看出,通过设置不同的运行模式可以使主播端直播应用程序以单进程或多进程运行,满足不同的性能需求。并且,通过设置不同的标记位还可以将插件加载功能和编码功能中的一个从主控进程中独立出来。
[0092] 进一步,编码功能通常为主播端直播应用程序最为核心的功能之一,在现有技术中,实现编码功能的各个函数、接口和参数等封装在编码模块中。主控进程运行时将编码模块加载到主控进程中,进而主控进程可以任意调用编码功能的各个函数、接口和参数。在本发明实施例中,由于主播端直播应用程序既可以单进程运行又可以多进程运行,因此,为了使主播端直播应用程序无论单进程运行还是多进程运行均可以正常编码,本发明实施例对编码模块至少作出了以下改进:
[0093] 将现 有技 术中的 编 码模 块的 编码 功能封 装在 一个 模块中 ,即LiveEncoderLocalService编码本地服务模块中;添加用于接收指令,以及将接收到的指令转发到编码本地服务模块中的模块,即LiveEncoderStub编码存根模块;添加一个用于模拟编码模块原有的输出接口,以及透明传输编码本地服务模块处理结果的模块,即LiveEncoderProxy编码代理模块。令LiveEncoderLocalService编码本地服务模块连接LiveEncoderStub编码存根模块,以及令LiveEncoderProxy编码代理模块连接LiveEncoderLocalService编码本地服务模块。可选的,将LiveEncoderLocalService编码本地服务模块、LiveEncoderStub编码存根模块和LiveEncoderProxy编码代理模块封装在一个模块中,即LiveEncoder编码模块。
[0094] 基于以上对编码模块改进的介绍,下面就对本发明实施例如何应用改进后的编码模块编码进行介绍。
[0095] (1)如果主控进程创建了编码进程,即主播端直播应用程序运行在第一模式、第二模式和(第二标记位下的)第三模式下,S104中主控进程获取视频流包括:
[0096] 所述主控进程向编码存根模块发送编码指令,以通知所述编码进程编码视频流;
[0097] 所述编码进程调用与所述编码存根模块连接的编码本地服务模块编码出所述视频流;
[0098] 所述编码进程调用与所述编码本地服务模块连接的编码代理接口模块向所述主控进程反馈编码出的所述视频流。
[0099] 具体来讲,如果主控进程调用编码模块创建了编码进程,那么就将主播端直播应用程序的编码功能从主控进程中独立到编码进程中实现。编码进程从属于编码模块。当需要编码时,主控进程通过与编码进程间的RPC通过通信向编码存根模块发送编码指令来通知编码进程开始编码。编码进程响应于编码指令,调用编码本地服务模块中的相关方法和函数执行编码指令,从而编码出视频流。然后,编码进程再调用编码代理模块LiveEncoderProxy通过RPC通道向主控进程反馈编码好的视频流。
[0100] 进而,在S105中,主控进程将视频流发送至直播服务器,然后直播服务器将视频流转发给观看该主播的观众的观众端设备上。进而,观众端设备对视频流解码,解码出直播视频供观众观看。
[0101] (2)如果主控进程未创建了编码进程,即主播端直播应用程序运行在第三模式和(第一标记位的)第三模式下,S104中主控进程获取视频流包括:
[0102] 所述主控进程向编码存根模块发送编码指令;
[0103] 所述编码存根模块调用与所述编码存根模块连接的编码本地服务模块编码出所述视频流;
[0104] 所述编码本地服务模块调用与所述编码本地服务模块连接的编码代理接口模块向所述主控进程反馈编码出的所述视频流。
[0105] 具体来讲,如果主控进程未创建编码进程,那么主播端直播应用程序的编码功能则仍然由主控进程实现。具体地,当主控进程需要编码视频流时,生成编码指令。然后,主控进程向编码存根模块发送编码指令。接着,编码存根模块向编码本地服务模块发送编码指令,以调用编码本地服务模块中的方法和函数编码视频流。接着,编码本地服务模块将编码完成的视频流发送给编码代理模块,进而编码代理模块再将视频流透明传输给主控进程。
[0106] 以上是对主控进程和编码进程如何利用改进后的编码模块进行编码的介绍,下面则对主控进程如何创建编码进程,以及编码进程具体的编码过程进行介绍。
[0107] 首先对主控进程创建编码进程的过程进行介绍。在本发明实施例中,主控进程创建编码进程包括如下过程:
[0108] 所述主控进程调用进程创建函数;
[0109] 所述主控进程将所述主控进程的ID传入所述进程创建函数;
[0110] 所述主控进程运行所述进程创建函数创建所述编码进程,所述编码进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0111] 具体来讲,主控进程调用Windows系统的进程创建CreateProcess函数创建一个编码进程RpcLiveEncoderEncoder。主控进程在调用CreateProcess函数时,会将主控进程的进程ID当做命令行参数传递给CreateProcess函数,进而由CreateProcess函数创建的编码进程RpcLiveEncoderEncoder启动后就可以在命令行中获取主控进程的进程ID。接着,主控进程运行CreateProcess函数创建出编码进程RpcLiveEncoderEncoder。接下来,编码进程初始化进程环境,并建立与主控进程的连接,具体地,编码进程通过如下过程初始化进程环境并连接主控进程:
[0112] 所述编码进程注册初始化服务函数和视频流编码服务函数;
[0113] 创建存储视频材料的视频共享内存以及存储音频材料的音频共享内存;
[0114] 获取所述进程创建函数所具有的所述主控进程的ID连接所述主控进程;
[0115] 基于与所述主控进程的连接,向所述主控进程发送所述视频共享内存的标识和所述音频共享内存的标识。
[0116] 具体来讲,编码进程RpcLiveEncoderEncoder通过调用RpcCreateInstance方法创建一个RPC通信客户端实例句柄hRpc,对应地,主控进程为服务器。然后,调用RpcRegisterProcedure函数,将编码进程RpcLiveEncoderEncoder的初始化服务函数init_encoder注册到hRpc中,以及将视频流编码服务函数encode_raw_buffer注册到hRpc中。在本发明实施例中,初始化服务函数init_encoder用于响应主控进程的初始化命令,根据初始化命令中的额定参数完成编码初始化工作,编码流服务器函数encode_raw_buffer用于响应主控进程的编码指令,对主控进程指定内存中的视频材料和音频材料进行编码,并将编码后所获取的数据返回给主控进程。
[0117] 接下来,创建存储视频材料和音频材料的内存。在本发明实施例中,考虑到如果需要编码清晰度较高的视频流,例如1080p的视频流,那么每帧图像的数据量都比较大;同时,如果采用RPC传输进程之间的数据,也会带来较大的性能消耗,因此为了避免编码数据不必要的传输,本发明实施例采用共享内存的方式来优化性能。具体地,调用Windows系统的CreateFileMapping函数创建一个名为RpcLiveEncoderEncoder_video_X的视频共享内存,以及创建一个名为RpcLiveEncoderEncoder_Audio_X的音频共享内存。当然,在具体实现过程中,视频共享内存和音频共享内存的命名可以根据实际进行设置,本发明不做具体限制。
[0118] 接下来,编码进程读取命令行中的主控进程的进程ID,调用RpcStartService函数建立与主控进程之间的RPC通信通道。然后,基于RPC通道调用主控进程的client_process_ready函数,以通知主控进程编码进程初始化进程环境完成。
[0119] 主控进程根据编码进程对client_process_ready函数的调用,从RPC通道内获取编码进程在RPC连接中的sessionId会话ID,并确定编码进程环境初始化完成,进而在后续过程中根据需要通知编码进程编码视频流。
[0120] 另外,主控进程基于编码进程的sessionId调用编码进程的rpc_encoder_sharememory_name函数获取编码进程所创建的视频共享内存标识和音频共享内存标识。
[0121] 通过上述过程,就完成了对编码进程的创建。接下来,对编码进程具体的编码过程进行介绍。
[0122] 首先,为了使得观众端设备能够顺利获取并解码视频流,需要先向观众端设备提供解码头参数。因此,在通过编码进程编码出视频流并反馈给主控进程之前,还包括:
[0123] 所述主控进程向所述编码进程发送初始化命令,所述初始化命令包括用于指导所述编码进程确定解码头参数的额定参数,所述解码头参数包括视频解码头参数和音频解码头参数;
[0124] 所述编码进程基于所述初始命令运行所述初始化服务函数,以基于所述额定参数获得所述视频解码头参数和所述音频解码头参数;
[0125] 所述编码进程向所述主控进程反馈所述视频解码头参数和所述音频解码头参数,以使所述主控进程将所述视频解码头参数和所述音频解码头参数发送至所述直播服务器,所述直播服务器再将所述视频解码头参数和所述音频解码头参数转发给所述观众端设备。
[0126] 具体来讲,主控进程向编码进程发送初始化init_encoder命令。该命令包括用于指导编码进程确定解码头参数的额定参数,而额定参数则由主控进程根据主播的选择确定。在本发明实施例中,额定参数包括但不限于分辨率信息(宽度width和高度height),视频码率videoBitrate,视频帧率fps,视频编码器类型videoCodec,音频编码器的声道数audioChannel,音频采样率audioSampleRate,音频码率audioBitrate,以及音频编码器类型audioCodec。
[0127] 编码进程从RPC通道接收初始化init_encoder命令后,通过初始化服务函数init_encoder响应,具体地:调用CreateMediaFile函数创建一个多媒体文件IMediaFile接口;然后根据init_encoder命令中的视频编码器类型videoCodec调用IMediaFile接口的CreateEncoder方法创建一个类型为videoCodec的视频编码器接口videoEncoder,以及根据init_encoder命令中的音频编码器类型audioCodec调用CreateEncoder方法创建一个类型为audioCodec的视频编码器接口audioEncoder;调用视频编码器接口videoEncoder的Open方法将编码视频的宽度width、高度height、视频码率videoBitrate、视频帧率fps作为参数来初始化视频编码器接口IMediaEncoder,以及调用音频编码器audioEncoder的Open方法,将音频编码器的声道数audioChannel、音频采样率audioSampleRate、音频码率audioBitrate作为参数来初始化音频编码器audioEncoder。
[0128] 接着,编码进程调用IMediaFile接口的readVideoHeader获取到视频编码器接口IMediaEncoder的视频解码头参数videoHeader,以及调用IMediaFile接口的readAudioHeader方法获取音频编码器audioEncoder的音频解码头参数audioHeader。
[0129] 然后,编码进程将获取到的视频解码头参数videoHeader和音频解码头参数audioHeader通过RPC通道发送给主控进程。而主控进程则会进一步将的视频解码头参数videoHeader和音频解码头参数audioHeader发送给直播服务器,进而直播服务器将的视频解码头参数videoHeader和音频解码头参数audioHeader发送给各个观众端设备。那么,观众端设备就可以根据的视频解码头参数videoHeader和音频解码头参数audioHeader对视频和音频进行解码播放。
[0130] 获得解码头参数后,就可以获取编码的视频流了。在本发明实施例中,S104中通过编码进程获得编码视频流具体通过如下过程:
[0131] 所述编码进程接收所述主控进程发送的编码命令;
[0132] 基于所述编码命令,从所述视频分享内存中提取由所述主控进程预先存储的视频材料,以及从所述音频分享内存中提取由所述主控进程预先存储的音频材料;
[0133] 运行所述视频流编码服务函数对所述视频材料进行编码,获得视频编码数据,以及对所述音频材料进行编码,获取音频编码数据,所述视频流包括所述视频编码数据和所述音频编码数据;
[0134] 将所述视频编码数据和所述音频编码数据反馈给所述主控进程。
[0135] 具体来讲,主控进程根据前文获得的视频共享内存的标识,将需要编码的视频材料预先存储到视频共享内存中,以及根据前文获得的音频共享内存的标识,将需要编码的音频材料预先存储到音频共享内存中。在具体实现过程中,视频材料和音频材料的内容通常是匹配的,例如来源于同一个文件或者均有主播端设备采集。然后,在需要编码出视频流时,主控进程通过与编码进程间的RPC通道向编码进程发送编码命令encode_raw_buffer。
[0136] 编码进程接收到encode_raw_buffer命令后,通过编码函数响应,具体地:调用videoEncoder接口的Encode方法,读取视频共享内存中的视频材料进行编码,将视频编码数据返回给主控进程;以及调用audioEncoder的Encode方法,对音频共享内存中的音频材料进行编码,将音频编码数据返回给主控进程。其中,视频编码数据和音频编码数据构成视频流,二者根据时间轴对应。
[0137] 以上就是对编码进程编码视频流的介绍。通过上述过程,编码进程就实现了单独编码视频流。
[0138] 主控进程接收到来自编码进程返回的视频流后,将视频流存入发送队列中发送到直播服务器。进而,直播服务器在接收视频流后,再将视频流转发给各个观众端设备,观众端设备对接收到的视频流依次解码,进而向用户播放主播的直播视频,由此完成直播。
[0139] 另外,在具体实现过程中,编码进程可能由于异常的而崩溃,为了使主播端直播应用程序能够继续编码进而继续直播,本发明实施例中的直播方法还可以进一步包括:
[0140] 所述主控进程监控所述编码进程是否崩溃;
[0141] 如果所述主控进程监控到所述编码进程崩溃,所述主控进程重新创建所述编码进程。
[0142] 具体来讲,主控进程监控编码进程的运行状态,如果监控到编码进程崩溃,则按照上文介绍的创建编码进程的方式重新创建编码进程,此处就不再重复赘述了。
[0143] 以上是对编码进程的介绍,下面对插件加载进程以及插件加载的方法进行介绍。
[0144] 在本发明实施例中,主播端直播应用程序的插件加载在插件加载进程内部,进而即使插件异常也不会影响主控进程的运行。类似于编码进程,插件进程也通过RPC通道与主控进程连接,并且,插件进程为了模拟出插件加载到主控进程的环境,会通过RPC通道调用主控进程的相关接口,使插件可以正常加载和运行。
[0145] 现有技术的主控进程在加载插件之前,需要知道有哪些插件,所以在加载插件之前,需要枚举插件。本发明实施例中的插件加载进程在加载插件之前,也需要向主控进程枚举插件。具体地,在插件加载进程在插件加载进程中加载需要在主播端直播应用程序中加载的目标插件之前,还包括:
[0146] 所述主控进程创建插件枚举器进程;
[0147] 所述插件枚举器进程向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件;
[0148] 所述主控进程确定从所述备选插件中确定出所述目标插件,并通知所述插件加载进程所述目标插件。
[0149] 首先对主控进程创建插件枚举器进程的过程进行介绍,主控进程通过如下方式创建插件枚举器进程:
[0150] 所述主控进程调用进程创建函数;
[0151] 所述主控进程将所述主控进程的ID传入所述进程创建函数;
[0152] 所述主控进程运行所述进程创建函数创建所述插件枚举器进程,所述插件枚举器进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0153] 主控进程加载RpcPluginManager远程插件管理器模块,该模块负责插件枚举器进程RpcPluginFinder的创建,并且命令RpcPluginFinder枚举插件的功能。将RpcPluginManager模块加载到主控进程中后,调用该模块中的CreatePluginManager函数,创建一个插件管理器接口IPluginManager。
[0154] 接下来,主控进程调用插件管理器接口IPluginManager的初始化init方法,使init方法进一步调用Windows系统的进程创建函数CreateProcess创建插件枚举器进程RpcPluginFinder。在调用CreateProcess函数时,主控进程也会将主控进程的进程ID当做命令行参数传递给CreateProcess函数。
[0155] 接下来,主控进程运行创建函数CreateProcess就可以创建出插件枚举器进程RpcPluginFinder了。
[0156] 通过上述过程就完成了插件枚举器进程的创建。而插件枚举器进程在创建完成后,也需要初始化进程环境,以及建立与主控进程的连接。具体来讲,插件枚举器进程通过如下过程初始化环境:
[0157] 在所述插件枚举器进程中注册枚举插件函数和枚举退出函数;
[0158] 获取所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0159] 具体来讲,通过调用RpcCreateInstance创建一个RPC通信客户端实例句柄hRpc;调用RpcRegisterProcedure函数,将枚举插件的功能函数,即枚举插件函数get_plugins注册到hRpc中,枚举插件函数用于响应主控进程的枚举插件指令去枚举插件;调用RpcRegisterProcedure函数,将枚举退出函数也注册到hRpc中,枚举退出函数用于响应主控进程获取到所有插件后发送的枚举退出指令,使插件枚举进程退出;根据命令行中的主控进程的进程ID,调用RpcStartService函数,建立与主控进程之间的RPC通道;调用主控进程的client_process_ready函数,以通知主控进程插件枚举器进程初始化完成。
[0160] 主控进程根据插件枚举器进程对client_process_ready函数的调用,从RPC通道内获取到插件枚举器进程在RPC连接中的sessionId会话ID,并确定插件枚举器进程环境初始化完成,进而在后续过程中根据需要通知插件枚举器进程枚举插件。
[0161] 通过上述过程,就完成了对插件枚举器进程的创建。接下来,对插件枚举器进程具体的枚举过程进行介绍。插件枚举器进程向主控进程枚举当前加载目录中存在的且能够加载的备选插件,包括:
[0162] 所述插件枚举器接收所述主控进程发送的枚举指令,调用所述枚举插件函数进程读取所述加载目录下的所有插件;
[0163] 从所有的所述插件中过滤出合法插件;
[0164] 从所述合法插件中过滤出所述主播端直播应用程序支持的所述备用插件。
[0165] 具体来讲,本发明实施例中的备选插件指的是供主控进程选择加载的插件。当主控进程需要加载插件时,会先向插件枚举器进程发送枚举指令,获得所有备选插件。插件枚举器进程从RPC通道接收到主控进程发送的枚举指令后,调用枚举函数get_plugins枚举当前加载目录下的所有插件。
[0166] 具体来讲,get_plugins函数调用FindFirstFile函数,获取加载目录下的第一个DLL(动态链接库,Dynamic Link Library)文件。接着,get_plugins函数调用FindNextFile函数继续获取加载目录下的下一个DLL文件。如果FindNextFile函数返回值为真,表示获取到了下一个DLL文件,则再次执行FindNextFile函数,继续获取下一个DLL文件;如果FindNextFile函数返回值为假时,表示已经获取完加载目录下的所有DLL文件。只要FindNextFile函数的返回值为真,则进行获取下一个DLL文件,直到FindNextFile函数返回值为假。
[0167] 在具体实现过程中,主播有可能会将一些不合法的插件添加到加载目录中,但是不合法的插件是不能加载的,因此获取到所有插件后,进一步判断获取的插件是否合法,将不合法的插件过滤掉。
[0168] 具体来讲,调用系统的LoadLibrary函数加载每个DLL文件,如果能够成功调用LoadLibrary函数,那么表示该DLL文件合法;反之,如果LoadLibrary函数调用失败,那么表示该DLL文件不合法。针对每个DLL文件调用LoadLibrary函数后,将不合法的DLL文件从加载目录中卸载,将合法DLL文件保留。
[0169] 进一步,对于主播端直播应用程序而言,尽管一个插件是合法的,但是主播端直播应用程序也有可能不支持该插件,因此在本发明实施例中,为了保证最终为主控进程提供的备选插件均为主播端直播应用程序支持的插件,还需要进一步针对合法DLL文件进行过滤,从而得到主播端直播应用程序支持的插件。
[0170] 在具体实现过程中,插件枚举器进程按照不同的支持条件进行过滤,本发明不做具体限制。举例来说,主播端直播应用程序所支持的插件具体为具备导出函数的插件,那么,具体判断合法插件是否能够被支持的方法为:调用系统的GetProcAddress函数获取一个合法DLL文件中的导出函数,如果能够获取到导出函数,则确定该DLL文件对应的插件为主播端直播应用程序可以支持的插件,进而将该插件保留为备选插件;反之,如果未获取到导出函数,则确定该DLL文件对应的插件为主播端直播应用程序不支持的插件,进而从加载目录中卸载该插件。
[0171] 通过上述过程,就获得了一个或多个备选插件。接下来,插件枚举器进程通过与主控进程的RPC通道,将确定出的备选插件的名称提供给主控进程。
[0172] 进一步,为了节约主播端设备的系统资源,在插件枚举器进程向主控进程枚举当前加载目录中存在的且能够加载的备选插件之后,还包括:
[0173] 所述主控进程向所述插件枚举器进程发送退出指令;
[0174] 所述插件枚举器基于所述退出指令调用所述枚举退出函数结束进程。
[0175] 具体来讲,主控进程在接收到插件枚举器进程枚举的插件后,向插件枚举进程发送退出指令。插件枚举器进程接收退出指令后,调用枚举退出函数退出插件枚举器进程。
[0176] 接下来,主控进程自动从备选插件中选取目标插件,或者根据主播的选取操作确定对应的目标插件,然后通过与插件加载进程的RPC通道,将目标插件的名称通知插件加载进程。进而,插件加载进程根据目标进程的名称获取目标插件的DLL文件,从而加载并运行目标插件。
[0177] 一个具体的例子,假设当前加载的插件需要调用主控进程的加法方法才能加载,那么,插件加载进程通过与主控进程的RPC通道调用主控进程的加法方法,使插件检测到加法方法,从而能够成功加载。进一步,主控进程调用插件运行,插件加载进程通过与主控进程的RPC通道接收主控进程发送的触发该插件运行的指令,进而触发该插件运行。该插件运行过程中需要使用减法方法,那么,插件加载进程通过与主控进程的RPC通道调用主控进程的减法方法,使该插件使用减法方法进行处理,从而获得处理结果。插件加载进程获取该插件运行的结果,通过与主控进程的RPC通道将该插件的运行结果反馈给主控进程。
[0178] 另外,如果加载的插件会产生图像和音频,即插件需要向主播展示图像和声音,那么插件加载进程则需要通过与主控进程的RPC通道将插件产生的图像和音频传输到主控进程。然后,主控进程再根据插件产生的图像绘制窗口展示图像,以及通过播放器播放音频,从而将插件产生的图像和声音展示给主播。
[0179] 当然,主控进程同样也需要监控插件加载进程,因此本发明实施例还包括以下方案:
[0180] 所述主控进程监控所述插件加载进程是否崩溃;
[0181] 如果所述主控进程监控到所述插件加载进程崩溃,重新创建所述插件加载进程。
[0182] 具体来讲,主控进程监控插件加载进程的运行状态,如果监控到插件加载进程崩溃,则按照上文介绍的创建插件枚举器进程和插件加载进程的方式重新创建插件枚举器进程和插件加载进程,此处就不再重复赘述了。
[0183] 基于与前述实施例中直播的方法同样的发明构思,本发明第二方面还提供一种直播的装置,如图2所示,包括:
[0184] 启动单元101,用于启动主播端直播应用程序;
[0185] 主控进程获取单元102,用于获取所述主播端直播应用程序的主控进程;
[0186] 进程创建单元103,用于创建编码进程和/或插件加载进程,所述编码进程用于基于所述主控进程的控制编码出视频流,并向所述主控进程反馈所述视频流,所述插件加载进程用于在所述插件加载进程中加载插件,并根据所述主控进程的控制调用加载的插件;
[0187] 视频流获取单元104,用于获取所述视频流;
[0188] 发送单元105,用于将所述视频流发送至直播服务器,以使所述直播服务器将所述视频流转发给接入所述直播服务器的观众端设备。
[0189] 具体来讲,所述主控进程获取单元102用于判断预先设置的所述主播端直播应用程序的运行模式;如果所述运行模式为第一模式,创建所述主播端直播应用程序的所述主控进程,其中,在所述第一模式下,所述主控进程将创建所述编码进程和所述插件加载进程;如果所述运行模式为第二模式,获取预设的所述主控进程的地址,并基于所述地址接入所述主控进程,其中,在所述第二模式下,所述主控进程将创建所述编码进程和所述插件加载进程。
[0190] 进一步,所述装置还包括:
[0191] 模式判断单元,用于在所述通过所述主控进程创建编码进程或插件加载进程之前,判断预先设置的所述主播端直播应用程序的运行模式;
[0192] 标记获取单元,用于如果所述运行模式为第三模式,在创建编码进程和/或插件加载进程之前,获取表示需要创建所述编码进程和/或所述插件加载进程的标记位;
[0193] 如果所述标记位为第一标记位,所述进程创建单元103具体用于通过所述主控进程创建所述插件加载进程;
[0194] 如果所述标记位为第二标记位,所述进程创建单元103具体用于通过所述主控进程创建所述编码进程。
[0195] 进一步,如果所述主控进程创建了所述编码进程,所述视频流获取单元104用于向编码存根模块发送编码指令,以通知所述编码进程编码视频流,所述编码进程调用与所述编码存根模块连接的编码本地服务模块编码出所述视频流,所述编码进程调用与所述编码本地服务模块连接的编码代理接口模块向所述视频流获取单元反馈编码出的所述视频流。
[0196] 而如果所述主控进程未创建所述编码进程,所述视频流获取单元104则用于向编码存根模块发送编码指令,所述编码存根模块调用与所述编码存根模块连接的编码本地服务模块编码出所述视频流,所述编码本地服务模块调用与所述编码本地服务模块连接的编码代理接口模块向所述视频流获取单元反馈编码出的所述视频流。
[0197] (1)如果本发明实施例需要创建编码进程,那么所述进程创建单元103用于调用进程创建函数,将所述主控进程的ID传入所述进程创建函数,运行所述进程创建函数创建所述编码进程,所述编码进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0198] 进一步,所述装置还包括编码进程环境初始单元,用于在所述编码进程创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程,具体用于在所述编码进程中注册初始化服务函数和视频流编码服务函数,创建存储视频材料的视频共享内存以及存储音频材料的音频共享内存,获取所述进程创建函数所具有的所述主控进程的ID连接所述主控进程,基于所述编码进程与所述主控进程的连接,向所述主控进程发送所述视频共享内存的标识和所述音频共享内存的标识。
[0199] 更进一步,所述装置还包括编码初始化单元,用于在所述通过所述编码进程编码出视频流并反馈给所述主控进程之前,向所述编码进程发送初始化命令,所述初始化命令包括用于指导所述编码进程确定解码头参数的额定参数,所述解码头参数包括视频解码头参数和音频解码头参数,基于所述初始命令运行所述初始化服务函数,以基于所述额定参数获得所述视频解码头参数和所述音频解码头参数,向所述主控进程反馈所述视频解码头参数和所述音频解码头参数,以使所述主控进程将所述视频解码头参数和所述音频解码头参数发送至所述直播服务器,所述直播服务器再将所述视频解码头参数和所述音频解码头参数转发给所述观众端设备。
[0200] 所述视频流获取单元104用于接收所述主控进程发送的编码命令;基于所述编码命令,从所述视频分享内存中提取由所述主控进程预先存储的视频材料,以及从所述音频分享内存中提取由所述主控进程预先存储的音频材料;运行所述视频流编码服务函数对所述视频材料进行编码,获得视频编码数据,以及对所述音频材料进行编码,获取音频编码数据,所述视频流包括所述视频编码数据和所述音频编码数据;将所述视频编码数据和所述音频编码数据反馈给所述主控进程。
[0201] 更进一步,所述装置还包括编码进程监控单元,用于监控所述编码进程是否崩溃;如果监控到所述编码进程崩溃,重新创建所述编码进程。
[0202] (2)如果所述主控进程创建了所述插件加载进程,所述装置还包括:
[0203] 插件加载单元,用于在所述插件加载进程中加载需要在所述直播应用程序中加载的目标插件。
[0204] 那么,所述进程创建单元103还用于在所述插件加载进程中加载需要在所述直播应用程序中加载的目标插件之前,创建插件枚举器进程;
[0205] 所述装置还包括插件枚举单元,用于向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件;
[0206] 确定单元,用于确定从所述备选插件中确定出所述目标插件,并通知所述插件加载进程所述目标插件。
[0207] 具体来讲,所述进程创建单元103用于调用进程创建函数,将所述主控进程的ID传入所述进程创建函数,运行所述进程创建函数创建所述插件枚举器进程,所述插件枚举器进程在创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0208] 进一步,所述装置还包括插件加载进程环境初始单元,用于在所述插件枚举器进程创建完成后,初始化进程环境,并基于所述进程创建函数所具有的所述主控进程的ID连接所述主控进程,具体用于在所述插件枚举器进程中注册枚举插件函数和枚举退出函数,获取所述进程创建函数所具有的所述主控进程的ID连接所述主控进程。
[0209] 更进一步,所述插件枚举单元用于接收所述主控进程发送的枚举指令,调用所述枚举插件函数进程读取所述加载目录下的所有插件;从所有的所述插件中过滤出合法插件;从所述合法插件中过滤出所述主播端直播应用程序支持的所述备用插件。
[0210] 更进一步,所述装置还包括退出单元,用于在所述插件枚举器进程向所述主控进程枚举当前加载目录中存在的且能够加载的备选插件之后,向所述插件枚举器进程发送退出指令,基于所述退出指令调用所述枚举退出函数结束进程。
[0211] 更进一步,所述装置还包括插件加载进程监控单元,用于监控所述插件加载进程是否崩溃,如果监控到所述插件加载进程崩溃,重新创建所述插件加载进程。
[0212] 前述图1实施例中的直播的方法的各种变化方式和具体实例同样适用于本实施例的直播的装置,通过前述对直播的方法的详细描述,本领域技术人员可以清楚的知道本实施例中直播的装置的实施方法,所以为了说明书的简洁,在此不再详述。
[0213] 基于与前述实施例中直播的方法同样的发明构思,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前文所述直播的方法的任一方法的步骤。
[0214] 基于与前述实施例中直播的方法同样的发明构思,本发明还提供一种计算机设备,如图3所示,包括存储器204、处理器202及存储在存储器204上并可在处理器202上运行的计算机程序,所述处理器202执行所述程序时实现前文所述控制进度条的方法的任一方法的步骤。
[0215] 其中,在图3中,总线架构(用总线200来代表),总线200可以包括任意数量的互联的总线和桥,总线200将包括由处理器202代表的一个或多个处理器和存储器204代表的存储器的各种电路链接在一起。总线200还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路链接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口206在总线200和接收器201和发送器203之间提供接口。接收器201和发送器203可以是同一个元件,即收发机,提供用于在传输介质上与各种其他装置通信的单元。
[0216] 处理器202负责管理总线200和通常的处理,而存储器204可以被用于存储处理器202在执行操作时所使用的数据。
[0217] 本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:
[0218] 在本发明实施例的技术方案中,首先启动主播端直播应用程序,并获取主播端直播应用程序的主控进程,然后主控进程进一步创建插件加载进程,并在插件加载进程中加载需要在直播应用程序中加载的目标插件。由于本发明实施例采用多进程,利用插件加载进程加载插件,故而插件功能的异常不会影响主控进程,所以避免了由于一个或多个功能异常而导致程序崩溃,使得主播端直播应用程序更稳定地运行,由此解决了现有技术存在的如何提高主播端直播程序运行稳定性的技术问题。
[0219] 本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0220] 本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0221] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0222] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0223] 显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。