# huaweicloud-cloudPhone-codecPool **Repository Path**: HuaweiCloudDeveloper/huaweicloud-cloud-phone-codec-pool ## Basic Information - **Project Name**: huaweicloud-cloudPhone-codecPool - **Description**: 华为云手机编码池 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2023-07-03 - **Last Updated**: 2025-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### [华为云手机开源项目仓主入口](https://gitee.com/HuaweiCloudDeveloper/huaweicloud-cloud-phone) ### 编码池化方案介绍 #### 1. 整体方案 ![](res/codec_pool.png) ##### 1.1 云手机服务器 云手机服务器中运行着一组云手机,这些云手机中运行着客户的业务。当用户想要查看云手机的画面时,需要有编码模块对于云手机中的图像进行编码,以便传输和查看。如果直接使用云手机自身的资源进行编码,则会占用手机中应用的可用资源,为了让云手机有更多的资源来运行业务应用,我们可以把编码的事情交给外部的编码集群来完成。 ##### 1.2 编码集群 编码集群做的事情就是对云手机发过来的画面进行编码。编码集群由一台或多台带编码GPU的ECS服务器组成。 每台服务器上运行着一组编码进程,每一个编码进程可以为一路云手机提供编码服务,我们把每个编码进程称作一个worker。每台服务器上同时运行一个master进程,用于管理每一个编码进程的状态,将空闲的worker分配出去。 一台编码ECS服务器上的所有编码进程支持同一种配置,配置的选项包括编码方式、分辨率和最大帧率,不同的配置启动的worker路数不同。客户结合业务所需决定采用何种配置。例如一台服务器配置720P MIX 30FPS,可启动52路worker,配置1080P MIX 30FPS可启动25路,MIX表示同时支持H264和H265编码,具体配置参考2.2节。 ##### 1.3 弹性负载均衡 弹性负载均衡可以创建多个监听器,每个监听器对应不同的端口,每个监听器后面挂载支持相同分辨率的ECS服务器。如上图所示,监听器1后挂载支持720P的编码集群,监听器2后挂载支持1080P的编码集群。 每个监听器会配置健康检查,主动向master询问空闲worker数量。当空闲worker数量为0时,ELB会自动隔离无空闲worker的ECS服务器,新的请求连接不再分配到被隔离的机器。当空闲worker数量非0时,ELB会自动恢复有空闲worker的ECS服务器,新的请求连接继续调度到有空闲的机器。 如上图所示,CPH1需要720P H265 30FPS的编码,第一步将ECS配置成所需规格,第二步请求分配时访问elbIp和port1,返回720P集群中空闲worker的workerIp和workerPort,第三步CPH1访问对应worker实现编码。CPH5需要1080P H265 30FPS的编码,将ECS配置成所需规格后,请求分配时访问elbIp和port2即可。 **云手机服务器、编码集群和弹性负载均衡,要求在相同VPC网络下,购买部署时请注意。** #### 2. 部署集群 ##### 2.1 购买机器 目前支持如下规格的ecs,参照下图购买,选择公共镜像**Ubuntu 18.04 server 64bit for cph codec (40GiB)**,系统盘40G。 - 并行计算型|pc3.8xlarge.2|32vCPUs|64GiB - GPU加速型|g6.6xlarge.4|24vCPUs|96GB ![](res/purchase_pc3.png) ##### 2.2 修改配置 机器创建成功后,master和worker默认启动,默认配置项参考下表。 | 组件 | 配置项 | 默认值 | 用途 | 范围 | | ------ | --------------- | ------- | --------------- |---------------------------| | master | port | 5050 | ELB后端节点端口 | (1024,65535) | | master | healthCheckPort | 8080 | ELB健康检查端口 | (1024,65535) | | master | healthCheckUrl | /health | ELB健康检查url | 以/开头 | | worker | videoFrameType | MIX | 帧类型 | H264/MIX,MIX同时支持H264和H265 | | worker | resolution | 720P | 分辨率 | 720P/1080P | | worker | frameRate | 20 | 帧率 | 20/30/60 | | worker | quality | LOW | 质量等级 | LOW/MEDIUM | 机器创建成功后,默认支持720P MIX 20FPS编码,不同编码规格支持的路数不同,规格和路数的关系参考下表(质量等级为LOW)。 | 分辨率 | 编码类型 | 帧率 | pc3.8xlarge.2 | g6.6xlarge.4 | | ------ | -------- | ---- | ------------- | ------------ | | 720P | H264 | 20 | 90 | 72 | | 720P | H264 | 30 | 60 | 48 | | 720P | H264 | 60 | 30 | 24 | | 720P | MIX | 20 | 78 | 63 | | 720P | MIX | 30 | 52 | 42 | | 720P | MIX | 60 | 26 | 21 | | 1080P | H264 | 20 | 39 | 30 | | 1080P | H264 | 30 | 26 | 20 | | 1080P | H264 | 60 | 13 | 10 | | 1080P | MIX | 20 | 36 | 27 | | 1080P | MIX | 30 | 25 | 18 | | 1080P | MIX | 60 | 12 | 9 | 当编码质量等级为MEDIUM时,路数为上表中的路数*0.6并下取整后的值 客户结合业务诉求搭建不同的编码集群,支持命令行快速修改配置,使用方式如下 ```shell config_codecpool.sh -m master port, Specifies the port of the master, optionals: 1024~65535 -c health check port, Specifies the port of health check, optionals: 1024~65535 -u health check url, Specifies the url of health check -e encode type, Specifies the encode type, optionals: H264/MIX -r resolution type, Specifies the resolution type of encode, optionals: 720P/1080P -f encode frame fps, Specifies the frame rate of encode, optionals: 20/30/60 -q worker quality, Specifies the quality of worker, optionals: LOW/MEDIUM. config_codecpool.sh -m 5050 -c 8080 -u /health -e H264 -r 720P -f 20 -q LOW 如上命令执行后, master和worker会重新拉起并使用最新配置 ``` #### 3 部署ELB ##### 3.1 购买ELB 参照下图购买**共享型ELB|按需计费|仅内网访问** ![](res/purchase_elb_1.png) ##### 3.2 配置监听器 参照下图配置ELB监听器,前端协议为TCP。 ![](res/elb_config_listener.png) ##### 3.3 配置后端策略 参照下图配置后端分配策略,后端协议为TCP,分配策略类型为加权轮训算法。 ![](res/elb_config_policy.png) ##### 3.4 添加后端节点 添加购买的机器,后端端口为master配置项port对应值。 ![](res/elb_add_pc3.png) ##### 3.5 配置健康检查 在监听器中配置健康检查。 ![](res/elb_config_health_check_1.png) 健康检查协议为HTTP,特定端口为2.1中healthCheckPort对应值,健康检查路径为2.1中healthCheckUrl对应值。 ![](res/elb_config_health_check_2.png) ELB健康检查的灵敏度由下图参数决定,建议配置为如下所选值。 ![](res/elb_config_health_check_3.png) #### 4 业务场景 ##### 4.1 不同集群 客户结合业务决定是否需要搭建不同编码能力的集群,一个集群对应ELB上一种监听器,如下图所示。codec-pool-elb-listener-720监听器后端节点支持720P编码,端口为9010;codec-pool-elb-listener-1080-h265监听器后端节点支持1080P编码,端口为9020。 ![](res/elb_config_multi_policy.png) ##### 4.2 池化编码 客户使能编码池化,在调用音视频接口时,需要传入ELB对应的IP和端口。 ```java int OpenVideo(const char* jsonConfig, VideoCallback callback); jsonConfig中通过如下字段指定 remote_scheduling_elb_ip elb内网ip remote_scheduling_elb_port elb内网port ``` 若请求分配无空闲worker时,云手机音视频SDK会根据客户设置的frame_type进行选择。若frame_type为h264,则自动选择本地编码;若frame_type为h265,则返回错误码-3300,提示客户无worker资源,重新设置为h264本地编码。 ##### 4.3 扩缩容 在云监控服务,针对ELB的异常主机数创建告警规则,客户结合异常主机数占比,来决定进一步扩缩容。当异常主机数占主机总数的比例持续达到90%时,客户可结合业务进行扩容,即新购买机器添加到监听器后端。当异常主机数占主机总数的比例持续较低时,客户可结合业务进行缩容,即从监听器后端移除机器。 ![](res/elb_config_monitor_1.png) ![](res/elb_config_monitor_2.png) ##### 4.4 升级镜像 编码池化新增特性会更新镜像,客户若使用池化新特性,需要更新存量机器的镜像。按照如下步骤更新镜像,可实现用户无感知切换。 ###### 4.4.1 自动隔离 从ELB监听器后端移除预升级镜像的ECS,移除后新的请求流量将不再转发到这台ECS,实现自动隔离。 ![](res/upgrade_img_remove.png) ###### 4.4.2 存量退出 自动隔离后的ECS,隔离前的接入持续在工作中,需要等待存量全部退出。通过在ECS上执行如下命令,当useCount数量为0时,存量接入全部退出。 ```shell tail -f /var/log/master/master.log ``` ![](res/upgrade_img_use_count.png) ###### 4.4.3 切换镜像 在ECS界面选择 **更多 - 镜像 - 切换操作系统**,切换为最新的池化公共镜像。公共镜像默认配置是78路720P MIX 20FPS编码,若使用的不是默认配置,请参照2.2节修改配置。 ![](res/upgrade_img_switch.png) ###### 4.4.4 自动恢复 从ELB监听器后端添加升级镜像后的ECS,添加后新的请求流量将继续转发到这台ECS,实现自动恢复。 ![](res/upgrade_img_add.png)