开发者社区> 问答> 正文

OSS如何实现RTMP推流上传?

OSS支持使用RTMP协议推送H264编码的视频流+AAC编码的音频流到OSS。推送到OSS的音视频数据可以点播播放;在对延迟不敏感的应用场景,也可以做直播用途。
通过RTMP协议上传音视频数据目前有以下限制:

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

下面会分别介绍如何推送音视频流到OSS,以及如何点播,直播播放。

向OSS推送音视频数据



获得推流地址


使用SDK调用PutLiveChannel接口,创建一个LiveChannel,并获取对应的推流地址。如果Bucket的权限控制(ACL)为 公共读写(public-read-write),那么可以直接使用得到的推流地址进行推流;否则需要进行签名操作。
以使用python SDK为例,获取未签名以及签名推流地址的代码如下:
  1. [backcolor=transparent]# 以使用python sdk为例
  2. [backcolor=transparent]from[backcolor=transparent] oss2 [backcolor=transparent]import[backcolor=transparent] [backcolor=transparent]*
  3. [backcolor=transparent]from[backcolor=transparent] oss2[backcolor=transparent].[backcolor=transparent]models [backcolor=transparent]import[backcolor=transparent] [backcolor=transparent]*
  4. [backcolor=transparent]host [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"oss-cn-hangzhou.aliyuncs.com"[backcolor=transparent] [backcolor=transparent]#just for example
  5. [backcolor=transparent]accessid [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"your-access-id"
  6. [backcolor=transparent]accesskey [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"your-access-key"
  7. [backcolor=transparent]bucket_name [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"your-bucket"
  8. [backcolor=transparent]channel_name [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"test-channel"
  9. [backcolor=transparent]auth [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]Auth[backcolor=transparent]([backcolor=transparent]accessid[backcolor=transparent],[backcolor=transparent] accesskey[backcolor=transparent])
  10. [backcolor=transparent]bucket [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]Bucket[backcolor=transparent]([backcolor=transparent]auth[backcolor=transparent],[backcolor=transparent] host[backcolor=transparent],[backcolor=transparent] bucket_name[backcolor=transparent])
  11. [backcolor=transparent]channel_cfg [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]LiveChannelInfo[backcolor=transparent]([backcolor=transparent]target [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]LiveChannelInfoTarget[backcolor=transparent]())
  12. [backcolor=transparent]channel [backcolor=transparent]=[backcolor=transparent] bucket[backcolor=transparent].[backcolor=transparent]create_live_channel[backcolor=transparent]([backcolor=transparent]channel_name[backcolor=transparent],[backcolor=transparent] channel_cfg[backcolor=transparent])
  13. [backcolor=transparent]publish_url [backcolor=transparent]=[backcolor=transparent] channel[backcolor=transparent].[backcolor=transparent]publish_url
  14. [backcolor=transparent]signed_publish_url [backcolor=transparent]=[backcolor=transparent] bucket[backcolor=transparent].[backcolor=transparent]sign_rtmp_url[backcolor=transparent]([backcolor=transparent]"test-channel"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"playlist.m3u8"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]3600[backcolor=transparent])

获得的推流地址示例如下:
  1. [backcolor=transparent]publish_url [backcolor=transparent]=[backcolor=transparent] rtmp[backcolor=transparent]:[backcolor=transparent]//your-bucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel
  2. [backcolor=transparent]signed_publish_url [backcolor=transparent]=[backcolor=transparent] rtmp[backcolor=transparent]:[backcolor=transparent]//your-bucket.oss-cn-hangzhou.aliyuncs.com/live/your-channel?OSSAccessKeyId=LGarWrijh8HjKWg6&playlistName=t.m3u8&Expires=1472201595&Signature=bjKraZTTyzz9%2FpYoomDx4Wgh%2FlM%3D"


使用ffmpeg进行推流


可以使用ffmpeg推送本地的视频文件到OSS,命令如下:
  1. [backcolor=transparent]ffmpeg [backcolor=transparent]-[backcolor=transparent]i [backcolor=transparent]1.flv[backcolor=transparent] [backcolor=transparent]-[backcolor=transparent]c copy [backcolor=transparent]-[backcolor=transparent]f flv [backcolor=transparent]"rtmp://your-bucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?OSSAccessKeyId=LGarWrijh8HjKWg6&Expires=1472199095&Signature=%2FAvRo7FTss1InBKgwn7Gz%2FUlp9w%3D"


使用OBS进行推流


首先点击 [backcolor=transparent]Settings,在 [backcolor=transparent]URL 框中输入前面步骤获取的推流地址,然后点击 [backcolor=transparent]OK 开始推流即可。
如下图所示,请注意推流地址的拆分方式:

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



直播场景


在推流的过程中,可以通过HLS协议播放正在推送的内容,各个平台的播放方法如下:
  • 在Android、iOS等移动平台,直接在浏览器输入LiveChannel对应的播放地址即可。
  • Mac OS可以使用safari浏览器进行播放。
  • PC端可以安装vlc播放器进行播放。

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

点播场景


推流的过程中,OSS总是以直播的方式更新m3u8文件。所以对于点播的场景,需要在推流结束后,调用PostVodPlaylist接口来组装一个点播用的m3u8文件,然后使用该文件地址来播放。
对于点播的场景,可以设置较大的GOP来减少ts文件数,降低码率。

展开
收起
青衫无名 2017-10-17 15:31:44 7921 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载