阿里云直播服务拉流地址播放不出来

5 篇文章 0 订阅
4 篇文章 1 订阅

推流没问题,拉流地址却无论如何也播放不出来?

公司采用的是阿里云直播服务,本人从头到尾看了一遍官方文档,踩了一个大坑,小小吐槽一下阿里的官方文档,在关键的地方含糊不清。望诸君看完此片博文顺利避开。
阿里直播服务官方文档

首先声明此坑不分种族,不分语言,不分框架

在阿里直播的控制台上,地址生成器里生成的地址如下,
地址生成器
使用obs来模拟推流,使用vlc来播流,真是流畅的不能再流畅,但是跟着文档结合到项目中,推流地址倒是好整,跟着官方文档顺利拼接成功,问题就出在拉流地址上,咋拼接也不行,就是播放不了,官方文档如下:
推拉流地址拼接规则
拉流地址出现的问题就是在鉴权串上,官方文档是这样说的:
鉴权 URL 由直播推流地址或播放地址 + 验证串组成。验证串是根据鉴权 key + 失效时间通过 md5 算法计算出,该地址适用于 PC 端、移动端、第三方推流和播放工具。

在这里插入图片描述
鉴权串的生成示例:
在这里插入图片描述
官方文档给的示例就是上面这张图,但是如果在生成鉴权串的时候不加入各自的格式后缀的话,那就会发现播流如何也无法播放

生成推拉流地址的代码

# 推流
ALIYUN_LIVE_PUSH_URL_TEMPLATE = "rtmp://{domain}/{app_name}/{stream_name}?auth_key={timestamp}-{rand}-{uid}-{md5hash}"
# 拉流
ALIYUN_LIVE_PULL_TEMPLATE_RTMP = "rtmp://{domain}/{app_name}/{stream_name}?auth_key={timestamp}-{rand}-{uid}-{md5hash}"
ALIYUN_LIVE_PULL_TEMPLATE_FLV = "http://{domain}/{app_name}/{stream_name}.flv?auth_key={timestamp}-{rand}-{uid}-{md5hash}"
ALIYUN_LIVE_PULL_TEMPLATE_HLS = "http://{domain}/{app_name}/{stream_name}.m3u8?auth_key={timestamp}-{rand}-{uid}-{md5hash}"

def md5sum(self,src):
        m = hashlib.md5()
        m.update(src)
        return m.hexdigest()

def a_auth(self, domain, app_name, strean_name, suffix, end_time, key):
	'''
    @suffix:推拉流格式的后缀
    '''
    exp = int(end_time.timestamp())  # expiration     time: 1 hour after current itme
    path = "/%s/%s%s" % (app_name, strean_name, suffix)
    rand = "0"  # "0" by default, other value is ok
    uid = "0"  # "0" by default, other value is ok
    sstring = "%s-%s-%s-%s-%s" % (path, exp, rand, uid, key)
    # print(path, exp, rand, uid, key)  # /app/stream 1584857710 0 0 mdjBugUx7O
    hashvalue = self.md5sum(sstring.encode('utf-8'))
    pulish_format_data = {
        "domain": domain,
        "app_name": app_name,
        "stream_name": strean_name,
        "timestamp": exp,
        "rand": rand,
        "uid": uid,
        "md5hash": hashvalue,
    }
    return pulish_format_data

 def create_channel(self, appname, strname, end_time):
     """
     @return:
         {"pulish_url": "", "pull_hls": "", "pull_flv": "", "pull_rtmp": ""}
     """
     # TODO: 判断那个域名下的正在推流是否达到限制,
     # 鉴权
     cdn_domain = settings.ALIYUN_LIVE_CDN_DOMAIN
     # stream name: timestamp + enterprise
     # 拼接自定义推流地址 "rtmp://{domain}/{app_name}/{stream_name}?auth_key={timestamp}-{rand}-{uid}-{md5hash}
     # 推流
     key1 = "使用自己阿里云的"  # private key of     authorization
     pulish_format_data = self.a_auth(settings.ALIYUN_LIVE_PUSH_DOMAIN, appname, strname, '', end_time, key1)
     pulish_rtmp = ALIYUN_LIVE_PUSH_URL_TEMPLATE.format(**pulish_format_data)


     # 拼接拉流地址
     key2 = "使用自己阿里云的"  # private key of     authorization
     # rtmp 拉流
     pull_format_data = self.a_auth(settings.ALIYUN_LIVE_CDN_DOMAIN, appname, strname, '', end_time, key2)
     pull_rtmp = ALIYUN_LIVE_PULL_TEMPLATE_RTMP.format(**pull_format_data)

     # flv 拉流
     pull_format_data = self.a_auth(settings.ALIYUN_LIVE_CDN_DOMAIN, appname, strname, '.flv', end_time, key2)
     pull_flv = ALIYUN_LIVE_PULL_TEMPLATE_FLV.format(**pull_format_data)

     # hls(m3u8) 拉流
     pull_format_data = self.a_auth(settings.ALIYUN_LIVE_CDN_DOMAIN, appname, strname, '.m3u8', end_time, key2)
     pull_hls = ALIYUN_LIVE_PULL_TEMPLATE_HLS.format(**pull_format_data)


     # return data
     data = {
         "pulish_url": pulish_rtmp,
         "pull_hls": pull_hls,
         "pull_flv": pull_flv,
         "pull_rtmp": pull_rtmp
     }
     return data

总结:

在生成自定义的鉴权串时,要加上各自的格式后缀

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值