`
can_do
  • 浏览: 265668 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过java代码生成阿里云直播推流和播流地址

阅读更多
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阿里云直播推流播流地址生成工具类.zip

    java阿里云直播工具类,阿里云直播推流地址,播流地址生成

    java直播推流

    Java直播推流是一种在互联网上实时传输视频内容的技术,它涉及到多个关键技术环节,包括编码、传输、解码和播放。本篇文章将详细讲解如何使用Java进行RTSP推流到Nginx服务器,以及Nginx如何生成RTMP和HLS流,以便在...

    四、JAVA调用海康威视SDK实现摄像头内网推流到阿里云

    阿里云提供了多种服务用于接收和处理视频流,如阿里云直播服务(Apsara Live)。我们需要了解阿里云的相关API和SDK,学习如何配置和使用这些服务。推流的过程可能涉及到RTMP协议,这是一种广泛用于实时音视频传输的...

    java实现使用STS临时访问凭证访问阿里云OSS.zip

    STS服务是阿里云的身份和访问管理(IAM)组件之一,它提供了临时凭证的生成和验证功能。使用STS,您可以创建一个包含Access Key ID、Access Key Secret和Security Token三部分的临时凭证,这个凭证具有时效性,过期...

    最新版java代码生成器基于springMvc+mysql 后台功能一键生成

    最新版java代码生成器基于springMvc+mysql 后台功能一键生成 压缩包里的jdk文件目录 请自行下载jdk1.8.0_45版本并覆盖进去 没有jdk是运行不起来的 也可以下载其他jdk版本 但是jdk1.8.0_45这个文件目录名称不要更改 ...

    基于freemarker的JAVA代码生成工具

    **基于Freemarker的JAVA代码生成工具** 在软件开发过程中,尤其是企业级应用,大量重复性的代码编写工作是常见的现象,比如创建与数据库表对应的Java实体类、Service接口及实现、Controller以及MyBatis的Mapper和...

    调用阿里云API,java(异步实现)DDNS

    用java代码实现了UPDATE,这里是java源代码。‘增删改查’记录,‘改查’实现了目前增有得完善代码,删没删除需求就没添加删的代码。源代码,需要在param.properties文件中填写对应KEYValue值。同时也可以参考我的...

    海康威视推流RTMP-java代码demo

    本篇文章将深入解析如何利用Java调用海康威视的摄像头,将RTSP(Real Time Streaming Protocol)流转换为RTMP(Real-Time Messaging Protocol)流,以便在互联网上进行直播或点播。 RTSP是一种网络协议,主要用于...

    京东云视频直播视频录播Java工具类

    京东云视频直播视频录播Java示例代码。截取指定时间小视频。可以结合定时任务使用。详细介绍:https://www.yuque.com/docs/share/e33959e3-0c8f-4b74-b2b4-78533e370400?# 《京东云推流直播录播》

    Java下载https文件并上传阿里云oss服务器

    Java下载HTTPS文件并上传到阿里云OSS服务器是常见的文件操作任务,特别是在开发云存储解决方案时。以下将详细讲解这个过程中的关键知识点。 首先,Java下载HTTPS文件涉及到网络请求和安全证书的处理。HTTPS...

    java自动生成全套代码项目,可直接生成页面

    不知道怎么上传系统图片,java自动生成jsp,controller,service及实现类,mapper,操作简单,只需要自己在系统管理-代码生成里面进行操作即可,系统最后会导出具体操作文档,内自带mysql数据库脚本,源码需要在Tomcat...

    java代码生成器(Freemaker)

    它的基本工作原理是:将数据模型(通常是Java对象)与模板文件结合,通过模板引擎解析和处理后,生成所需的输出文本。FreeMarker使用简单的文本文件作为模板,这些模板可以包含变量、控制结构(如条件语句和循环)...

    java代码生成器(亲测,好用)

    通过自定义模板和规则,它能够自动化生成常见的业务逻辑代码、数据访问层(DAO)、服务层(Service)、控制器(Controller)以及实体类(Entity)等,大大简化了开发过程。 该工具的核心原理是基于元数据和模板引擎...

    阿里云IOT平台虚拟设备端数据上报-JAVA.rar

    阿里云IOT平台,IDEA开发的Java虚拟传感器数据上报程序,结合博客使用,博客配套资源源码。--西西菜鸟

    JAVA 对接腾讯云直播的实现

    JAVA 对接腾讯云直播的...JAVA 对接腾讯云直播的实现主要涉及到对腾讯云直播平台 API 调用、身份验证、签名生成和请求构建等步骤。开发者需要了解腾讯云直播平台的 API 接口和签名算法,从而实现对直播流的管理和控制。

    阿里云视频点播(视频上传+视频点播)JAVA

    同时,通过阿里云的监控服务,可以实时查看视频点播的流量、错误日志等信息,以便及时优化和调整服务。 在实际开发中,需要遵循阿里云的API调用规则,注意异常处理和错误码解析,以保证程序的稳定性和用户体验。...

    JAVA 随机生成MAC地址(可定制)

    java 版的随机生成 MAC地址,笔者原创。 可根据自己需求定制。 /** * 根据虚拟机类型生成随机Mac地址 * * @param hypervType 虚拟机类型 * KVM: QEMU虚拟机 * vmware: Vmware虚拟机 * 其他: 生成随机的Mac...

    Java代码生成器,MVC框架可以自动生产的工具

    通过连接数据库,选择任意数据表生成实体模型,支持简单SQL语句查询,直接浏览数据表结构和数据。 支持多项目管理,文件编辑,一键式生成代码。快速构建基础框架代码,并支持MVC 3层构架。 生成的项目可以直接导入...

    java版本词法、语法分析器以及三地址代码生成实验源代码

    Java版本的词法、语法分析器以及三地址代码生成是编译原理领域的重要实践内容,它们涉及到了编译器设计的基础阶段。在这个实验中,我们使用Java编程语言实现了这些核心功能,这使得代码具有跨平台的特性,并且利用...

    java生成CA证书

    在实际操作中,你需要编写Java代码来生成和签署证书,这部分可能涉及到`KeyPairGenerator`、`KeyStore`、`Certificate`等类的使用。同时,还需要了解如何配置和操作`keytool`命令行工具,它是Java提供的用于管理...

Global site tag (gtag.js) - Google Analytics