【OSS最佳实践】JAVA实现RTMP推流上传OSS的签名URL
背景介绍
OSS支持使用RTMP协议推送H264编码的视频流和AAC编码的音频流到OSS。推送到OSS的音视频数据可以点播播放;在对延迟不敏感的应用场景,也可以做直播用途。RTMP推流上传的流程是创建LiveChannel以后生成推流地址,关于这块的介绍在官方帮助文档里也有介绍,具体可以参考文档"RTMP推流上传"。由于目前提供的示例是Python的,本文主要介绍如何使用JAVA实现生成LiveChannel的签名URL,包括推流地址和播放地址。
签名URL格式
目前OSS JAVA SDK的CreateLiveChannelResult类获取到的推流地址和播放地址,是不带签名参数的,如果Bucket的权限是私有的话,那必须使用签名URL去推流。带签名的推流地址形如:
rtmp://${bucket}.${host}/live/${channel}?OSSAccessKeyId=xxx&Expires=yyy&Signature=zzz&${params}
- live:RTMP协议的app名称,OSS固定使用live。
- params:推流参数,格式与HTTP请求的query string相同,即形如varA=valueA&varB=valueB。
推流地址的签名规则中包含的参数及描述如下表所示。
可以通过playlistName来指定生成的m3u8文件名称,其值涵盖LiveChannel中的配置。
Signature的计算规则如下
base64(hmac-sha1(AccessKeySecret, + Expires + "\n" + CanonicalizedParams + CanonicalizedResource))
Signature计算规则中涉及的参数及描述如下表所示
创建LiveChannel
参考OSS的JAVA SDK的安装文档引入JavaSDK。import以下几个类
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.CreateLiveChannelRequest;
import com.aliyun.oss.model.CreateLiveChannelResult;
通过CreateLiveChannelRequest类创建LiveChennel,通过CreateLiveChannelResult获取推流地址和播放地址,示例代码如下
public static void main(String[] args) { // TODO Auto-generated method stub // endpoint以杭州为例,其它region请按实际情况填写 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建 String accessKeyId = "<您的AccessKeyId>"; String accessKeySecret = "<您的AccessKeySecret>"; String bucketName = "<您的Bucket名称>"; String liveChannelName = "testChannel";//您的LiveChannel的名称,例如testChannel // 创建OSSClient实例 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); //创建livechannel,打印推流地址和播放地址(未签名) CreateLiveChannelRequest request = new CreateLiveChannelRequest(bucketName, liveChannelName); CreateLiveChannelResult result = new CreateLiveChannelResult(); result = ossClient.createLiveChannel(request); System.out.println("推流地址:"+result.getPublishUrls()); System.out.println("播放地址:"+result.getPlayUrls()); // 关闭client ossClient.shutdown(); }
生成签名推流URL
引入如下依赖
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
private final static String CHARSET_UTF8 = "utf8"; private final static String ALGORITHM = "HmacSHA1";
构造签名字符串函数,返回签名字符串signString
public static String buildSignString(String Expires,String CanonicalizedParams,String CanonicalizedResource){ String signString = Expires + "\n" + CanonicalizedParams + "\n" + CanonicalizedResource; return signString; }
计算签名的函数,参数为签名字符串signString+AccessKeySecret
public static String hmacSha1(String signString, String AccessKeySecret) { try { Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec keySpec = new SecretKeySpec(AccessKeySecret.getBytes(), ALGORITHM); mac.init(keySpec); byte[] rawHmac; rawHmac = mac.doFinal(signString.getBytes(CHARSET_UTF8)); return new String(Base64.encodeBase64(rawHmac)); } catch (Exception e) { throw new RuntimeException(e); } }
主函数,生成推流URL
public static void main(String[] args) throws Exception{ String bucketName= "<您的Bucket名称>"; String Endpoint= "oss-cn-hangzhou.aliyuncs.com";//Endpoint String channelName = "testChannel";//liveCahnnel名称 String CanonicalizedParams = "playlistName:playlist.m3u8";//格式为"playlistName:<指定的m3u8名称>" String CanonicalizedResource = "/test-bucket/testChannel";//CanonicalizedResource格式为/BucketName/ChannelName String accessKeyId= "<您的AccessKeyId>"; String secretAccessKey= "<您的AccessKeySecret>"; String Expires = Long.toString(System.currentTimeMillis()/1000L+3600); //生成一个unix时间戳Expires,定义URL过期时间 String Signature = (hmacSha1(buildSignString(Expires,CanonicalizedParams,CanonicalizedResource),secretAccessKey)); //推流地址的格式是:rtmp://bucketName.Endpoint/live/channelName?playlistName=playlist.m3u8&Expires=xxx&OSSAccessKeyId=xxx&Signature=xxx System.out.println("推流地址是\n"+"rtmp://"+bucketName+"."+Endpoint+"/live/"+channelName+"?playlistName=playlist.m3u8"+"&Expires="+Expires+"&OSSAccessKeyId="+accessKeyId+"&Signature="+Signature); }
生成签名播放URL
m3u8的签名播放地址可以用JavaSDK里的generatePresignedUrl方法来直接生成,示例如下
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); Date expiration = new Date(new Date().getTime() + 360000 * 1000); java.net.URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration); System.out.println(url); ossClient.shutdown();
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Dubbo源码解析之SPI(一):扩展类的加载过程
Dubbo是一款开源的、高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。 Dubbo最早是阿里公司内部的RPC框架,于 2011 年开源,之后迅速成为国内该类开源项目的佼佼者,2018年2月,通过投票正式成为 Apache基金会孵化项目。目前宜信公司内部也有不少项目在使用Dubbo。 本系列文章通过拆解Dubbo源码,帮助大家了解Dubbo,做到知其然,并且知其所以然。 一、JDK SPI 1.1 什么是SPI? SPI(Service Provider Interface),即服务提供方接口,是JDK内置的一种服务提供机制。在写程序的时候,一般都推荐面向接口编程,这样做的好处是:降低了程序的耦合性,有利于程序的扩展。 SPI也秉承这种理念,提供了统一的服务接口,服务提供商可以各自提供自己的具体实现。大家都熟知的JDBC中用的就是基于这种机制来发现驱动提供商,不管是Oracle也好,MySQL也罢,在编写代码时都一样,只不过引用的jar包不同而已。后来这种理念也被运用于各种架构之中,比如Dubbo、Elea...
- 下一篇
Centos7编译安装kafka-manager
简介 kafka-manager是目前最受欢迎的kafka集群管理工具,最早由雅虎开源,用户可以在Web界面执行一些简单的集群管理操作。具体支持以下内容: 管理多个集群 轻松检查群集状态(主题,消费者,偏移,代理,副本分发,分区分发) 运行首选副本选举 使用选项生成分区分配以选择要使用的代理 运行分区重新分配(基于生成的分配) 使用可选主题配置创建主题(0.8.1.1具有与0.8.2+不同的配置) 删除主题(仅支持0.8.2+并记住在代理配置中设置delete.topic.enable = true) 主题列表现在指示标记为删除的主题(仅支持0.8.2+) 批量生成多个主题的分区分配,并可选择要使用的代理 批量运行重新分配多个主题的分区 将分区添加到现有主题 更新现有主题的配置 支持ldap用户认证 kafka-manager 项目地址:https://github.com/yahoo/kafka-manager 安装 当前版本已更新至3.0.0.1,本次安装最新版本。 下载安装包 下载方式: 下载源码包:https://github.com/yahoo/kafka-manager/r...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果