OSS支持使用RTMP协议推送H264编码的视频流和AAC编码的音频流到OSS。推送到OSS的音视频数据可以点播播放;在对延迟不敏感的应用场景,也可以做直播用途。本文介绍如何推送音视频流到OSS,以及如何播放推送到OSS的音视频数据。

使用限制

  • 只能使用RTMP推流的方式,不支持拉流。
  • 上传的音视频数据中必须包含视频流,且视频流格式为H264。
  • 上传的音视频数据中可选择是否包含音频流。若包含音频流,则只支持AAC格式的音频流,其他格式的音频流会被丢弃。
  • 转储只支持HLS协议。
  • 一个LiveChannel同时只能有一个客户端向其推流。

向OSS推送音视频数据

  • 获得推流地址

    使用SDK调用PutLiveChannel接口,创建一个LiveChannel,并获取对应的推流地址。如果Bucket的权限控制(ACL)为公共读写(public-read-write),可直接使用获取的推流地址进行推流;如果Bucket ACL为公共读(public-read)或者私有(private),则需要进行签名操作。有关签名的具体步骤,请参见在URL中包含签名

    以Python SDK为例,获取未签名以及签名推流地址的代码如下:

    # -*- coding: utf-8 -*-
    import oss2
    # host以杭州为例,其它Region请按实际情况填写。
    host = "oss-cn-hangzhou.aliyuncs.com" 
    # 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    accessid = "yourAccessyId"
    accesskey = "yourAccessSecret"
    # 填写Bucket名称。
    bucket_name = "yourBucket"
    # 填写LiveChannel名称,例如test-channel。
    channel_name = "test-channel"
    auth = Auth(accessid, accesskey)
    bucket = Bucket(auth, host, bucket_name)
    channel_cfg = LiveChannelInfo(target = LiveChannelInfoTarget())
    channel = bucket.create_live_channel(channel_name, channel_cfg)
    publish_url = channel.publish_url
    # 生成RTMP推流的签名URL,并设置过期时间为3600秒。
    signed_publish_url = bucket.sign_rtmp_url("test-channel", "playlist.m3u8", 3600)
    
    # 打印未签名推流地址。
    print('publish_url='+publish_url)
    # 打印播放地址。print('play_url='+play_url)
    # 打印签名推流地址。
    print('signed_publish_url='+signed_publish_url)

    获得的推流地址示例如下:

    publish_url = rtmp://your-bucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel
    signed_publish_url = rtmp://your-bucket.oss-cn-hangzhou.aliyuncs.com/live/your-channel?OSSAccessKeyId=LGarxxxxxxHjKWg6&playlistName=t.m3u8&Expires=1472201595&Signature=bjKraZTTyzz9%2FpYoomDx4Wgh%2FlM%3D"
  • 使用ffmpeg进行推流

    可以使用ffmpeg推送本地的视频文件到OSS,命令如下:

    ffmpeg -i 1.flv -c copy -f flv "rtmp://your-bucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?OSSAccessKeyId=LGarxxxxxxHjKWg6&Expires=1472199095&Signature=%2FAvRo7FTss1InBKgwn7Gz%2FUlp9w%3D"
  • 使用OBS进行推流

    首先单击Settings,在URL文本框中输入前面步骤获取的推流地址,然后单击OK开始推流。

    如下图所示,请注意推流地址的拆分方式:

播放推送到OSS的音视频数据

  • 直播场景

    在推流的过程中,可以通过HLS协议播放正在推送的内容。各个平台的播放方法如下:

    • 在Android、iOS等移动平台,直接在浏览器输入LiveChannel对应的播放地址即可。
    • Mac OS可以使用safari浏览器进行播放。
    • PC端可以安装VLC多媒体播放器进行播放。安装完成后,在VLC media player页面,选择媒体(M)打开网络串流(N),然后将获取的播放地址play_url填写至请输入网络URL文本框。

    为了直播流畅,可以设置比较小的FragDuration,例如2s;另外,GOP的大小最好固定且与LiveChannel的FragDuration配置一致。OBS的GOP (即keyframe Interval)设置方法如下:

  • 点播场景

    推流的过程中,OSS总是以直播流的方式推送/更新M3U8。因此,对于点播的场景,需要在推流结束后,调用PostVodPlaylist接口来组装一个点播用的m3u8文件,然后使用该文件地址来播放。

    对于点播的场景,可以设置较大的GOP来减少ts文件数,从而降低码率。