1、阿里云推流和播流地址生成逻辑
1> 通过 req_auth 请求对象。http://cdn.example.com/video/standard/1K.html
2> 密钥设为:aliyuncdnexp1234(由用户自行设置)。
3> 鉴权配置文件失效日期为:2015年10月10日00:00:00,计算出来的秒数为 1444435200。
4> 服务器会构造一个用于计算 Hashvalue 的签名字符串。/video/standard/1K.html-1444435200-0-0-aliyuncdnexp1234
5> 服务器会根据该签名字符串计算 HashValue。HashValue = md5sum("/video/standard/1K.html-1444435200-0-0-aliyuncdnexp1234") = 80cd3862d699b7118eed99103f2a3a4f
6> 请求时 URL 为 http://cdn.example.com/video/standard/1K.html?auth_key=1444435200-0-0-80cd3862d699b7118eed99103f2a3a4f
8> 计算出来的 HashValue 与用户请求中带的 md5hash = 80cd3862d699b7118eed99103f2a3a4f 值一致,于是鉴权通过。
2、Java代码示例如下:
1> AliyunLiveUtil.java
package com.cnd.iov.utils;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
/**
* 阿里云直播工具类
*/
public class AliyunLiveUtil {
private static Logger logger = LoggerFactory.getLogger(AliyunLiveUtil.class);
/**
* 推拉流地址示例: rtmp://www.ttest.ygdjonline.com/a/a?auth_key=1558065152-0-0-
* c3cb54d946c0590ca9aeee63573201ee 播流地址 原画
* rtmp://www.btest.ygdjonline.com/a/a?auth_key=1558065152-0-0-
* fc711455c0815aeb581385f33451d5b4
* http://www.btest.ygdjonline.com/a/a.flv?auth_key=1558065152-0-0-
* 221abff1da1ee32151e365cf0dd42a53
* http://www.btest.ygdjonline.com/a/a.m3u8?auth_key=1558065152-0-0-
* 72124fcc3aee3404b0d65dcc114e207f
*/
/**
* 根据配置信息生成推流地址,一般appName相同,streamName不同
* 此处将streamName作为独立参数传入
*
* @param paramStreamName
* @param configInfo
* @return String
*/
public static String createPushUrl(AliyunLiveConfigInfo configInfo, String paramStreamName) {
// 推流域名
String pushDomain = configInfo.getPushStreamDomain();
// 应用名称
String appName = configInfo.getAppName();
// 流名称
String streamName = paramStreamName;
// 推流签名key
String pushIdentKey = configInfo.getAuthKey();
// 签名url有效时间
Integer identUrlValidTime = configInfo.getValidTime();
// 计算过期时间
String timestamp = String.valueOf((System.currentTimeMillis() / 1000) + identUrlValidTime);
// 组合推流域名前缀
// rtmp://{pushDomain}/{appName}/{streamName}
String rtmpUrl = StrUtil.format("rtmp://{}/{}/{}", pushDomain, appName, streamName);
logger.info("推流域名前缀,rtmpUrl=" + rtmpUrl);
// 组合md5加密串
// /{appName}/{streamName}-{timestamp}-0-0-{pushIdentKey}
String md5Url = StrUtil.format("/{}/{}-{}-0-0-{}", appName, streamName, timestamp, pushIdentKey);
// md5加密
String md5Str = DigestUtil.md5Hex(md5Url);
logger.info("md5加密串,md5Url=" + md5Url + "------md5加密结果,md5Str=" + md5Str);
// 组合最终鉴权过的推流域名
// {rtmpUrl}?auth_key={timestamp}-0-0-{md5Str}
String finallyPushUrl = StrUtil.format("{}?auth_key={}-0-0-{}", rtmpUrl, timestamp, md5Str);
logger.info("最终鉴权过的推流域名=" + finallyPushUrl);
return finallyPushUrl;
}
/**
* 根据配置信息生成创建播流(拉流)地址,key=rtmpUrl、flvUrl、m3u8Url,代表三种播流方式
*
* @param configInfo
* @param paramStreamName
* @return
*/
public static Map<String, String> createPlayUrl(AliyunLiveConfigInfo configInfo, String paramStreamName) {
// 播流域名
String pullDomain = configInfo.getPlayStreamDomin();
// 应用名称
String appName = configInfo.getAppName();
// 流名称
String streamName = paramStreamName;
// 拉流签名key
String pullIdentKey = configInfo.getAuthKey();
// 签名url有效时间
Integer identUrlValidTime = configInfo.getValidTime();
// 计算过期时间
String timestamp = String.valueOf((System.currentTimeMillis() / 1000) + identUrlValidTime);
// 组合通用域名
// {pullDomain}/{appName}/{streamName}
String pullUrl = StrUtil.format("{}/{}/{}", pullDomain, appName, streamName);
logger.info("组合通用域名,pullUrl=" + pullUrl);
// 组合md5加密串
// /{appName}/{streamName}-{timestamp}-0-0-{pullIdentKey}
String md5Url = StrUtil.format("/{}/{}-{}-0-0-{}", appName, streamName, timestamp, pullIdentKey);
String md5FlvUrl = StrUtil.format("/{}/{}.flv-{}-0-0-{}", appName, streamName, timestamp, pullIdentKey);
String md5M3u8Url = StrUtil.format("/{}/{}.m3u8-{}-0-0-{}", appName, streamName, timestamp, pullIdentKey);
// md5加密
String md5Str = DigestUtil.md5Hex(md5Url);
String md5FlvStr = DigestUtil.md5Hex(md5FlvUrl);
String md5M3u8Str = DigestUtil.md5Hex(md5M3u8Url);
logger.info("md5加密串,md5Url =" + md5Url + " ------ md5加密结果,md5Str=" + md5Str);
logger.info("md5加密串,md5FlvUrl =" + md5FlvUrl + " ------ md5加密结果,md5FlvStr=" + md5FlvStr);
logger.info("md5加密串,md5M3u8Url=" + md5M3u8Url + " ------ md5加密结果,md5M3u8Str=" + md5M3u8Str);
// 组合三种拉流域名前缀
// rtmp://{pullUrl}?auth_key={timestamp}-0-0-{md5Str}
String rtmpUrl = StrUtil.format("rtmp://{}?auth_key={}-0-0-{}", pullUrl, timestamp, md5Str);
// http://{pullUrl}.flv?auth_key={timestamp}-0-0-{md5FlvStr}
String flvUrl = StrUtil.format("http://{}.flv?auth_key={}-0-0-{}", pullUrl, timestamp, md5FlvStr);
// http://{pullUrl}.m3u8?auth_key={timestamp}-0-0-{md5M3u8Str}
String m3u8Url = StrUtil.format("http://{}.m3u8?auth_key={}-0-0-{}", pullUrl, timestamp, md5M3u8Str);
logger.info("最终鉴权过的拉流rtmp域名=" + rtmpUrl);
logger.info("最终鉴权过的拉流flv域名 =" + flvUrl);
logger.info("最终鉴权过的拉流m3u8域名=" + m3u8Url);
HashMap<String, String> urlMap = new HashMap<>();
urlMap.put("rtmpUrl", rtmpUrl);
urlMap.put("flvUrl", flvUrl);
urlMap.put("m3u8Url", m3u8Url);
return urlMap;
}
}
2> 配置信息,AliyunLiveConfigInfo.java
package com.cnd.iov.utils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "aliyunlive")
public class AliyunLiveConfigInfo {
String pushStreamDomain;
String playStreamDomin;
String appName;
String streamNameInside;
String streamNameOutside;
String authKey;
Integer validTime;
public String getPushStreamDomain() {
return pushStreamDomain;
}
public void setPushStreamDomain(String pushStreamDomain) {
this.pushStreamDomain = pushStreamDomain;
}
public String getPlayStreamDomin() {
return playStreamDomin;
}
public void setPlayStreamDomin(String playStreamDomin) {
this.playStreamDomin = playStreamDomin;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getStreamNameInside() {
return streamNameInside;
}
public void setStreamNameInside(String streamNameInside) {
this.streamNameInside = streamNameInside;
}
public String getStreamNameOutside() {
return streamNameOutside;
}
public void setStreamNameOutside(String streamNameOutside) {
this.streamNameOutside = streamNameOutside;
}
public String getAuthKey() {
return authKey;
}
public void setAuthKey(String authKey) {
this.authKey = authKey;
}
public Integer getValidTime() {
return validTime;
}
public void setValidTime(Integer validTime) {
this.validTime = validTime;
}
}
3> maven配置文件片段
<!-- Hutool工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.0.12</version>
</dependency>
4> application.yml配置文件片段
aliyunlive:
push-stream-domain: live.yourcompany.com
play-stream-domin: liveplay.yourcompany.com
app-name: yourAppNamexxyyzz
stream-name-inside: yourStreaNameaabbcc
stream-name-outside: yourStreamName112233
auth-key: yourpassword
valid-time: 3600
分享到:
相关推荐
java阿里云直播工具类,阿里云直播推流地址,播流地址生成
Java直播推流是一种在互联网上实时传输视频内容的技术,它涉及到多个关键技术环节,包括编码、传输、解码和播放。本篇文章将详细讲解如何使用Java进行RTSP推流到Nginx服务器,以及Nginx如何生成RTMP和HLS流,以便在...
该方案采用阿里云直播SDK,实现了一个Java直播点播切换系统源码。项目包含420个文件,其中包括181个Java源文件、106个XML配置文件、96个PNG图片文件、8个AAR库文件、7个GIF动画文件、4个Gradle配置文件、3个Git忽略...
总的来说,通过阿里云的MPS服务和Java SDK,开发者可以轻松地实现在Java环境中对视频进行转码操作,从而满足各种格式转换和质量优化的需求。需要注意的是,视频转码可能会消耗大量的计算资源,因此在选择模板和配置...
STS服务是阿里云的身份和访问管理(IAM)组件之一,它提供了临时凭证的生成和验证功能。使用STS,您可以创建一个包含Access Key ID、Access Key Secret和Security Token三部分的临时凭证,这个凭证具有时效性,过期...
1.codeFactory: Java代码生成,依赖rapid-generator.4.0.6.jar, 支持自定义模板生成代码, 弱业务下完全解放体力劳动. 2.ssm模板实现:pojo,dao,daoimpl,service,serviceimpl,controller,各mapper.xml 代码自动生成, 3....
**基于Freemarker的JAVA代码生成工具** 在软件开发过程中,尤其是企业级应用,大量重复性的代码编写工作是常见的现象,比如创建与数据库表对应的Java实体类、Service接口及实现、Controller以及MyBatis的Mapper和...
京东云视频直播视频录播Java示例代码。截取指定时间小视频。可以结合定时任务使用。详细介绍:https://www.yuque.com/docs/share/e33959e3-0c8f-4b74-b2b4-78533e370400?# 《京东云推流直播录播》
Java代码生成工具新版 支持Oracle、DB2、SQLServer、MYSQL、数据库。 支持Struts1、Struts2、SpringMvc、Spring、Hibernate3框架。 支持自增主键,复合主键,外键关联。 生成Hibernate POJO类,Dao类,Service类,...
不知道怎么上传系统图片,java自动生成jsp,controller,service及实现类,mapper,操作简单,只需要自己在系统管理-代码生成里面进行操作即可,系统最后会导出具体操作文档,内自带mysql数据库脚本,源码需要在Tomcat...
标题 "java代码生成html文件" 指的是利用Java编程语言编写代码,生成HTML文档。HTML(HyperText Markup Language)是网页内容的标准标记语言,而Java则提供了强大的后端处理能力。在实际开发中,我们可能会遇到这样...
阿里云短信调用Java代码 aliyun 短信 java 发送 aliyun 短信 java 发送
在这个Java实现的Demo中,我们将探讨如何利用阿里云的SDK和Java语言来实现物联网设备的接入、数据交互以及设备管理。 1. **设备接入**: - 首先,你需要在阿里云物联网平台上注册并创建一个产品,定义产品的属性和...
通过自定义模板和规则,它能够自动化生成常见的业务逻辑代码、数据访问层(DAO)、服务层(Service)、控制器(Controller)以及实体类(Entity)等,大大简化了开发过程。 该工具的核心原理是基于元数据和模板引擎...
阿里云IOT平台,IDEA开发的Java虚拟传感器数据上报程序,结合博客使用,博客配套资源源码。--西西菜鸟
JAVA 对接腾讯云直播的...JAVA 对接腾讯云直播的实现主要涉及到对腾讯云直播平台 API 调用、身份验证、签名生成和请求构建等步骤。开发者需要了解腾讯云直播平台的 API 接口和签名算法,从而实现对直播流的管理和控制。
通过连接数据库,选择任意数据表生成实体模型,支持简单SQL语句查询,直接浏览数据表结构和数据。 支持多项目管理,文件编辑,一键式生成代码。快速构建基础框架代码,并支持MVC 3层构架。 生成的项目可以直接导入...
卡密自动生成代码 java代码 有兴趣的看看 来吧来吧卡密自动生成代码卡密自动生成代码卡密自动生成代码卡密自动生成代码
- **服务器端设置**:在Red5服务器上,需要设置相应的直播频道和流,为Android客户端提供推流目标地址。 3. **Android端实现** - **SDK选择**:Android直播推流通常需要使用特定的SDK,如ijkplayer、FFmpeg或 ...