【音视频服务】如何配置融云 CDN 服务?

欢迎前往融云官网了解直播 CDN 产品。本文介绍如何开始配置融云 CDN 服务。

开通服务

融云 CDN 是付费增值服务,且需要开通后才能使用。您可以访问开发者后台的融云 CDN页面开通服务。

开通融云 CDN 服务后,可看到域名配置证书管理防盗链配置。

选择推拉流模式

融云 CDN 支持三种不同的推拉流地址模式:

  • 开播自动推流:在后台配置后,所有直播房间的直播流都会自动推流到 CDN,观众可在客户端加入房间时获取 CDN 信息,或者使用客户端 SDK 提供的监听房间内 CDN 资源的方法。如果您希望直接从融云服务端获取拉流地址,可从 App 服务端调用融云服务端 API,详见获取融云 CDN 拉流地址
  • 开播手动推流:在直播主播开始推流后,您需要根据产品设计决定何时调接口让融云服务开始或停止推流到 CDN。观众可在客户端加入房间时获取 CDN 信息,或者使用客户端 SDK 提供的监听房间内 CDN 资源的方法。如果您希望直接从融云服务端获取拉流地址,可从 App 服务端调用融云服务端 API,详见获取融云 CDN 拉流地址
  • 自行生成推拉流地址:融云服务端不负责生成推拉流地址,您需要在您的应用服务器自行生成 CDN 推拉流地址。

自行拼接推拉流地址

自行生成推拉流地址模式下,可自行拼接生成 CDN 推拉流地址。需要拼接的字段包括推/拉流域名、自定义的 {AppName} 和自定义的 {StreamName}。您还可以通过在 CDN 拉流地址中添加分辨率、码率参数 {with}{height}{fps},拉取 CDN 转码流。

CDN 推流地址拼接规则

融云 CDN 仅支持 RTMP 协议的推流:

RTMPrtmp://推流域名/{AppName}/{StreamName}

拼接推流地址后,可调用客户端 SDK 或服务端 API 的旁路推流接口,传入 CDN 推流地址进行推流。

CDN 拉流地址拼接规则

融云 CDN 支持使用 RTMP、FLV、HLS 协议进行拉流。

如需使用 CDN 流的原始分辨率、帧率:

  • RTMPrtmp://拉流域名/{AppName}/{StreamName}
  • FLVhttp(s)://拉流域名/{AppName}/{StreamName}.flv
  • HLShttp(s)://拉流域名/{AppName}/{StreamName}.m3u8

如需拉取不同分辨率的 CDN 直播流(拉取非原始分辨率、码率的流会触发 CDN 转码服务,产生转码费用):

  • RTMPrtmp://拉流域名/{AppName}/{StreamName}_{with}_{height}_{fps}
  • FLVhttp(s)://拉流域名/{AppName}/{StreamName}_{with}_{height}_{fps}.flv
  • HLShttp(s)://拉流域名/{AppName}/{StreamName}_{with}_{height}_{fps}.m3u8

{with}{height} 参数为要拉取的 CDN 转码流的分辨率宽高,参考下方枚举值。{fps} 为帧率参数,支持 10/15/24/30

宽高限制列表

 [
    "176*144", "180*180", "256*144", "240*180", "320*180", "240*240", "320*240",
    "360*360", "480*360", "640*360", "480*480", "640*480", "720*480", "848*480",
    "960*720", "1280*720", "1920*1080", "144*176", "144*256", "180*240", "180*320",
    "240*320", "360*480", "360*640", "480*640", "480*720", "480*848", "720*960",
    "720*1280", "1080*1920"
]

例如,拉取 flv 协议的 CDN 流,并指定宽x高为 720*920,帧率为 15,则拼接后的地址如下:

http(s)://yourdomain/apppkey/roomid_720_960_15.flv

推荐使用融云 CDN 播放器进行播放。

注意

  • 如在开发者后台启用了防盗链,则您拼接的推拉流地址中还必须携带防盗链信息。防盗链地址的具体拼接规则请参见下文「防盗链配置」。
  • 2022 年 6 月前开通融云 CDN 服务的客户,如获取到的 HLS 拉流地址无法正常播放,请提交工单咨询。

域名配置

域名配置标签下配置并保存了推流域名和拉流域名后,会看到完整的配置界面。

配置推拉流域名

推拉流域名都需要填写二级域名,请确保此域名没有没有在别的 App Key 下配置过。

  • 域名是成对的,推流和拉流有绑定关系,新增和修改时需要一并修改。
  • 您需要确保一级域名已经备案过。如果因域名没有备案或涉及非法业务等原因导致推流或者拉流域名不可用,由此产生的任何后果由您自身承担。

推流与拉流域名配置生效后,系统会自动给该域名分配一个 CNAME。使用您的推流或拉流域名进行直播之前,需要需要您公司开发或服务运维人员在域名解析配置中添加对应的 CNAME 记录,让您的域名指向 CNAME。具体如何配置可以咨询域名供应商。

HTTPS 设置

HTTPS 设置是可选项。FLV/HLS 协议的直播流默认使用 HTTP,配置 SSL 证书后可以使用 HTTPS。

如果您没有在融云平台上传过证书,请点击新增证书,将证书上传。下图展示了提交证书的界面。

防盗链

防盗链配置是可选项。配置后会提升推拉流域名的安全。

开启后一定要配置推流和拉流地址有效期时间和加密 URL 的密文 KEY。

防盗链开启后,如果观众端遇到弱网( 融云 SDK 内部帮您在网络恢复后重新订阅成功 )会比没有防盗链多出一些恢复订阅时间。

自行生成防盗链推拉流地址

如果您选择的推拉流模式为自行生成推拉流地址,在您的服务端生成推拉流地址时在地址中加入防盗链相关信息。

相比普通推拉流地址,生成防盗链推拉流地址还需要用到以下防盗链参数:

防盗链参数 描述 补充说明
wsTime 生成推拉流地址时的 UNIX 时间。防盗链地址中直接携带该参数。 格式为 16 进制 UNIX 时间。防盗链地址中直接携带该参数。
KEY MD5 计算方式的密钥,在开发者后台配置,仅用于计算 wsSecret 可以自定义。
wsSecret 播放 URL 中的加密参数。防盗链地址中直接携带该参数。 值是通过将 KEYURIwsTime 依次拼接的字符串进行 MD5 加密算法得出,即 wsSecret = MD5(wsTime+URI+KEY)。

防盗链的推拉流地址生成示例:

假设原始 url(已包含推/拉流域名 + AppName + StreamName)为:http://cdn.rongcloud.cn/myappname/stream.flv

  1. 获取在开发者后台防盗链配置填入的 KEY,假设 KEY 为:rongcloud
  2. 获取 wsTime,即生成推拉流地址时的 UNIX 时间,假设为 1601026312,转换成 16 进制5f6db908。在计算 wsSecret 时需要用到。防盗链 URL 中也会直接携带该参数。
  3. 计算 wsSecret。防盗链 URL 中会直接携带该参数。
  4. 获取计算 wsSecret 需要用到的 URI 参数值。需要用到您自定义的 AppName 与 StreamName。拼接规则为 /{AppName}/{StreamName}。从本例的原始 URL 可得出 URI 为 /app/stream.flv
  5. 依次拼接 wsTime + URI + KEY,获取签名字符串。在本例中该拼接字符串为:5f6db908/app/stream.flvrongcloud
  6. 对签名字符串计算 md5hash,得到 wsSecret。即,wsSecret = md5sum(“5f6db908/app/stream.flvrongcloud”) = 79aead3bd7b5db4adeffb93a010298b5
  7. 使用上述步骤中得到的 wsSecretwsTime 参数,拼接成防盗链 URL:
    http://cdn.rongcloud.cn/app/stream.flv?wsSecret=79aead3bd7b5db4adeffb93a010298b5&wsTime=5f6db908

当用户发起带时间戳防盗链的 url 请求后,CDN 服务器会对 url 内容进行校验,判断时间有效性及 MD5 值,两个值其中有一个不符合要求,返回 403。

生成防盗链代码示例(golang)

package main

import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
    "strconv"
    "strings"
    "time"
)

func main() {
    secret, t := GenWsSecret("/live/abc", "key")
    fmt.Println(secret)
    fmt.Println(t)
}

func GenWsSecret(uri, key string) (string, string) {
    uri = fmt.Sprintf("/%s", strings.TrimLeft(uri, "/"))

    t := strconv.FormatInt(time.Now().Unix(), 16)

    ori := fmt.Sprintf("%s%s%s", t, uri, key)

    h := md5.New()
    h.Write([]byte(ori))

    return hex.EncodeToString(h.Sum(nil)), t
}

注意事项

  1. 在 20:00 至次日 2:00 进行的配置不会立即生效,会在 2 点后依次配置生效。在此时间段外进行配置会在 30 分钟后生效。
  2. 新配置生效后,原有的配置即刻作废。建议开发者避开业务高峰时段,并给还在使用老配置的房间用户发送提醒通知,重新订阅新地址。