我们推荐使用云容器(云主机 + Docker)的方式部署录制 SDK。使用这种方式,你无需管理底层服务器,只要提供打包好的镜像,即可运行容器,并仅为容器实际运行消耗的资源付费,可以节约成本。本文以阿里云弹性容器实例(Elastic Container Instance)为例介绍具体的部署方法,你也可以选择其他的云容器实例服务。
新建一个 Dockerfile,内容如下:
FROM ubuntu:18.04
MAINTAINER your name
# Create app directory
WORKDIR /usr/src/recording
# Install your dependencies
# Copy your exec file
COPY AgoraCoreService ./
COPY recorder ./
将下载的 SDK 包中 AgoraCoreService(在 bin 文件夹下) 和 recorder (在 samples/cpp/release/bin 目录下)文件复制到和 Dockerfile 文件相同的目录。
使用该 Dockerfile 制作镜像文件,并推送到阿里云 ECI 可以拉取的仓库。
具体操作请参考 Docker 官方文档。
操作步骤请参考从 Docker Hub 拉取 Nginx 镜像,下面给出本例使用的配置。你需要根据实际情况自行调整配置。
本文使用的配置仅作为示例用途,请根据你使用的阿里云账号自行设置地域、网络、安全组和数据卷的具体配置。
华东 2 可用区 G
关于如何创建专有网络 VPC 和交换机,详见管理专有网络和管理交换机。
所选安全组:recorder1 / sg-uf6aqr8dpzr7z340p96n
详见创建安全组。
NFS Volume
你需要购买并设置 NAS 用于保存录制文件,详见配置数据卷。
重启策略: Never
容器组名称:recording-eci
容器名称:recorder-docker1
镜像名:hub.xxx.cn:6066/uap/recorder
镜像版本:2.3.3.150v2
工作目录:/usr/src/recording
启动命令:/usr/src/recording/recorder
启动参数:录制的具体设置,可以参考设置录制选项。
--appId <yourAppId> --channelKey <token> --channelProfile 1 --recordFileRootDir /data/recorder --channel demo --uid 666 --appliteDir /usr/src/recording --idle 30 --lowUdpPort 40000 --highUdpPort 41004 --isMixingEnabled 1 --mixedVideoAudio 2
容器数据卷:recorder-nas,挂载路径(Mount Path) 为 /data/recorder
确认配置并创建实例后,即可运行弹性容器组。在 ECI 控制台的弹性容器实例列表中,可以看到正在运行的录制实例。
我们需要在配置的 NAS 存储中,检查录制文件。由于阿里云未提供直接访问 NAS 存储的功能,我们可以创建一个空的容器,挂载 NAS 并将启动命令设置为 sleep 9999
,然后使用阿里云提供的连接功能,在弹性容器实例列表中使用 ffmpeg 工具查看文件内容。
阿里云 CloudShell 支持使用命令行的方式来创建和管理弹性容器实例,下面给出创建实例的命令行示例供你参考。
命令行示例(CPU 0.25,Memory 0.5G):
aliyun eci CreateContainerGroup --RegionId=cn-shanghai --SecurityGroupId=sg-uf6aqr8dpzr7z340p96n --VSwitchId=vsw-uf6pzudts0vuhkmd6rdk9 --Volume.1.Name=recorder-nas --Volume.1.Type=NFSVolume --Volume.1.NFSVolume.Path=/ --Volume.1.NFSVolume.Server=3bd16484a9-scl52.cn-shanghai.nas.aliyuncs.com --Volume.1.NFSVolume.ReadOnly=False --ContainerGroupName=recording-eci1 --RestartPolicy=Never --Container.1.Image=hub.xxx.cn:6066/uap/recorder --Container.1.Name=recorder-docker1 --Container.1.Cpu=0.25 --Container.1.Memory=0.5 --Container.1.ImagePullPolicy=Always --Container.1.WorkingDir=/usr/src/recording --Container.1.Command.1=/usr/src/recording/recorder --Container.1.VolumeMount.1.Name=recorder-nas --Container.1.VolumeMount.1.MountPath=/data/recorder --Container.1.VolumeMount.1.ReadOnly=False --Container.1.Arg.1=—appId=<yourAppId> --Container.1.Arg.2=—channelKey=<token> --Container.1.Arg.3=--channelProfile=1 --Container.1.Arg.4=--recordFileRootDir=/data/recorder --Container.1.Arg.5=—channel=demo --Container.1.Arg.6=--uid=3600205 --Container.1.Arg.7=--appliteDir=/usr/src/recording --Container.1.Arg.8=--lowUdpPort=40000 --Container.1.Arg.9=--highUdpPort=41004 --Container.1.Arg.10=--isMixingEnabled=1 --Container.1.Arg.11=--mixedVideoAudio=2 --Container.1.Arg.12=--idle=15
命令行示例:
aliyun eci CreateContainerGroup --RegionId=cn-shanghai --SecurityGroupId=sg-uf6aqr8dpzr7z340p96n --VSwitchId=vsw-uf6pzudts0vuhkmd6rdk9 --Volume.1.Name=recorder-nas --Volume.1.Type=NFSVolume --Volume.1.NFSVolume.Path=/ --Volume.1.NFSVolume.Server=3bd16484a9-scl52.cn-shanghai.nas.aliyuncs.com --Volume.1.NFSVolume.ReadOnly=False --ContainerGroupName=recording-eci --RestartPolicy=Never --Container.1.Image=hub.xxx.cn:6066/uap/recorder --Container.1.Name=recorder-docker1 --Container.1.Cpu=0.5 --Container.1.Memory=1 --Container.1.ImagePullPolicy=Always --Container.1.VolumeMount.1.Name=recorder-nas --Container.1.VolumeMount.1.MountPath=/data/recorder --Container.1.VolumeMount.1.ReadOnly=False --Container.1.WorkingDir=/usr/src/recording --Container.1.Command.1=sleep --Container.1.Arg.1=9999