springboot集成阿里云直播,低延时直播
springboot集成阿里云直播,低延时直播
- 首先要在阿里云上配置推流域名、播流域名、推流鉴权key、拉流鉴权key、鉴权时间
- 引入pom依赖
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-live</artifactId><version>3.9.17</version></dependency>
- 配置文件配置直播属性
#阿里云直播#阿里云推流域名aliyun.live.push.domain=xxx.xxx.com#阿里云拉流域名aliyun.live.pull.domain=xxx.xxx.com#推流鉴权url keyaliyun.live.push.ident.key=xxxxxxxxxxxxxxxx#拉流鉴权的keyaliyun.live.pull.ident.key=xxxxxxxxxxxxxxxx#鉴权时间 30*2分钟aliyun.live.ident.url.validTime=3600
- 配置文件获取属性值
import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;/*** Created with IntelliJ IDEA.** @Author: Administrator* @Date: 2022/04/26/15:58* @Description:*/@Configuration@PropertySource("classpath:application.properties")public class AliYunhiZhiboConfig {/*** 推流域名*/@Value("${aliyun.live.push.domain}")private String aliyunLivePushDomain;/*** 拉流域名*/@Value("${aliyun.live.pull.domain}")private String aliyunLivePullDomain;/*** 推流鉴权url key*/@Value("${aliyun.live.push.ident.key}")private String aliyunLivePushIdentKey;/*** 拉流鉴权url key*/@Value("${aliyun.live.pull.ident.key}")private String aliyunLivePullIdentKey;/*** 鉴权url的有效时间(秒),默认30分钟,1800秒 key*/@Value("${aliyun.live.ident.url.validTime}")private Integer aliyunLiveIdentUrlValidTime;/*** OSS-区域代码*/@Value("cn-shanghai")private String regionId;public String getAliyunLivePushDomain() {return aliyunLivePushDomain;}public void setAliyunLivePushDomain(String aliyunLivePushDomain) {this.aliyunLivePushDomain = aliyunLivePushDomain;}public String getAliyunLivePullDomain() {return aliyunLivePullDomain;}public void setAliyunLivePullDomain(String aliyunLivePullDomain) {this.aliyunLivePullDomain = aliyunLivePullDomain;}public String getAliyunLivePushIdentKey() {return aliyunLivePushIdentKey;}public void setAliyunLivePushIdentKey(String aliyunLivePushIdentKey) {this.aliyunLivePushIdentKey = aliyunLivePushIdentKey;}public String getAliyunLivePullIdentKey() {return aliyunLivePullIdentKey;}public void setAliyunLivePullIdentKey(String aliyunLivePullIdentKey) {this.aliyunLivePullIdentKey = aliyunLivePullIdentKey;}public Integer getAliyunLiveIdentUrlValidTime() {return aliyunLiveIdentUrlValidTime;}public void setAliyunLiveIdentUrlValidTime(Integer aliyunLiveIdentUrlValidTime) {this.aliyunLiveIdentUrlValidTime = aliyunLiveIdentUrlValidTime;}}
- 控制器
/*** Created with IntelliJ IDEA.** @Author: Administrator* @Date: 2022/04/28/14:29* @Description:*/@RestController@RequestMapping("/zhibo")public class ZhiboController {@Autowiredprivate AliYunhiZhiboConfig aliyunConfig;/*** 返回的信息:* RTMP播放地址为: rtmp://playtest.gotyun.com/aUEVx/6nJg0?auth_key=1651052008-0-0-543efb99fe67ec487e404da7e312ab30* m3u8播放地址为: http://playtest.gotyun.com/aUEVx/6nJg0.m3u8?auth_key=1651052008-0-0-b4bf93d26805ae77f9e7cd79948cf963* flv播放地址为: http://playtest.gotyun.com/aUEVx/6nJg0.flv?auth_key=1651052008-0-0-a72fe00d653b27a2e675395703199e3f* [RTMP播放地址为: rtmp://playtest.gotyun.com/aUEVx/6nJg0?auth_key=1651052008-0-0-543efb99fe67ec487e404da7e312ab30, m3u8播放地址为: http://playtest.gotyun.com/aUEVx/6nJg0.m3u8?auth_key=1651052008-0-0-b4bf93d26805ae77f9e7cd79948cf963, flv播放地址为: http://playtest.gotyun.com/aUEVx/6nJg0.flv?auth_key=1651052008-0-0-a72fe00d653b27a2e675395703199e3f]* 推流地址是: rtmp://sendtest.gotyun.com/aUEVx/6nJg0?auth_key=1651052008-0-0-16a8511d9573709e37f33e6983661ff0* 推流地址是: rtmp://sendtest.gotyun.com/aUEVx/6nJg0?auth_key=1651052008-0-0-16a8511d9573709e37f33e6983661ff0*/@GetMapping("/dizhi")public void dizhi() {String appName = RandomStringUtils.randomAlphanumeric(5);;String streamName = RandomStringUtils.randomAlphanumeric(5);;long expireTime = 3600L;System.out.println(AliYunUtil.general_pull_url(aliyunConfig.getAliyunLivePullDomain(), null, appName, streamName, expireTime));System.out.println(AliYunUtil.generate_push_url(aliyunConfig.getAliyunLivePushDomain(), aliyunConfig.getAliyunLivePushIdentKey(), appName, streamName, expireTime));}}
- AliYunUtil直播工具类
import org.apache.commons.lang3.RandomStringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** Created with IntelliJ IDEA.** @Author: Administrator* @Date: 2022/04/26/16:00* @Description:*/public class AliYunUtil {/*** 计算md5* @param param* @return*/public static String md5(String param) {if(param == null || param.length() == 0) {return null;}try {MessageDigest md5 = MessageDigest.getInstance("MD5");md5.update(param.getBytes());byte[] byteArray = md5.digest();BigInteger bigInt = new BigInteger(1, byteArray);// 参数16表示16进制String result = bigInt.toString(16);// 不足32位高位补零while(result.length() < 32) {result = "0" + result;}return result;} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}/*** 生成推流地址* @param pushDomain 推流域名* @param pushKey 推流域名配置的鉴权Key* @param appName 推流AppName* @param streamName 推流StreamName* @param expireTime 过期时间(单位是秒)*/public static String generate_push_url(String pushDomain,String pushKey,String appName,String streamName,long expireTime) {String pushUrl = "";//推流域名未开启鉴权功能的情况下if(pushKey=="") {pushUrl = "rtmp://"+pushDomain+"/"+appName+"/"+streamName;}else {long timeStamp = System.currentTimeMillis()/1000L + expireTime;String stringToMd5 = "/"+appName+"/"+streamName+"-"+Long.toString(timeStamp)+"-0-0-"+pushKey;String authKey = md5(stringToMd5);pushUrl = "rtmp://"+pushDomain+"/"+appName+"/"+streamName+"?auth_key="+Long.toString(timeStamp)+"-0-0-"+authKey;}System.out.println("推流地址是: "+pushUrl);return pushUrl;}/*** 生成播放地址* @param pullDomain 播放域名* @param pullKey 播放鉴权Key* @param appName 播放appName(同推流appName)* @param streamName 播放streamName (同推流streamName)* @param expireTime 过期时间(单位是秒*/public static String general_pull_url(String pullDomain, String pullKey, String appName, String streamName, long expireTime) {//rtmp的拉流地址String rtmpUrl = "";//m3u8的拉流地址String hlsUrl = "";//flv的拉流地址String flvUrl = "";//播放域名未配置鉴权Key的情况下if(pullKey == "") {rtmpUrl = "rtmp://"+pullDomain+"/"+appName+"/"+streamName;hlsUrl = "http://"+pullDomain+"/"+appName+"/"+streamName+".m3u8";flvUrl = "http://"+pullDomain+"/"+appName+"/"+streamName+".flv";}else {long timeStamp = System.currentTimeMillis()/1000L + expireTime;String rtmpToMd5 = "/"+appName+"/"+streamName+"-"+Long.toString(timeStamp)+"-0-0-"+pullKey;String rtmpAuthKey = md5(rtmpToMd5);rtmpUrl = "rtmp://"+pullDomain+"/"+appName+"/"+streamName+"?auth_key="+Long.toString(timeStamp)+"-0-0-"+rtmpAuthKey;String hlsToMd5 = "/"+appName+"/"+streamName+".m3u8-"+Long.toString(timeStamp)+"-0-0-"+pullKey;String hlsAuthKey = md5(hlsToMd5);hlsUrl = "http://"+pullDomain+"/"+appName+"/"+streamName+".m3u8"+"?auth_key="+Long.toString(timeStamp)+"-0-0-"+hlsAuthKey;String flvToMd5 = "/"+appName+"/"+streamName+".flv-"+Long.toString(timeStamp)+"-0-0-"+pullKey;String flvAuthKey = md5(flvToMd5);flvUrl = "http://"+pullDomain+"/"+appName+"/"+streamName+".flv"+"?auth_key="+Long.toString(timeStamp)+"-0-0-"+flvAuthKey;}System.out.println("RTMP播放地址为: "+rtmpUrl);System.out.println("m3u8播放地址为: "+hlsUrl);System.out.println("flv播放地址为: "+flvUrl);/*List<String> url = new ArrayList<>();url.add("RTMP播放地址为: "+rtmpUrl);url.add("m3u8播放地址为: "+hlsUrl);url.add("flv播放地址为: "+flvUrl);*/return hlsUrl;}/*** main方法测试*/public static void main(String[] args) {// TODO Auto-generated method stub//生成长度为5的随机字符串作为appName和streamName(字母和数字组合)String appName = RandomStringUtils.randomAlphanumeric(5);;String streamName = RandomStringUtils.randomAlphanumeric(5);;long expireTime = 3600L;String pullDomain = "play.gotyun.com";//播流域名String pullKey = "";//播流keyString pushDomain = "send.gotyun.com";//推流域名String pushKey = "";//推流keySystem.out.println(general_pull_url(pullDomain, pullKey, appName, streamName, expireTime));System.out.println(generate_push_url(pushDomain, pushKey, appName, streamName, expireTime));}}
注意如果需要在移动端播放
,直接返回m3u8
地址,其它地址都不能正常在移动端播放
经过测试,这个还是有15s左右的延迟
在阿里云配置推流和拉流域名参考链接
springboot集成阿里云直播,低延时直播相关推荐
- SpringBoot集成阿里云短信服务
SpringBoot集成阿里云短信服务 1.准备工作 2.项目集成 2.1 添加依赖 2.2 配置文件 2.3 业务逻辑实现 在实际项目中经常有发送短信的功能,今天进说一下对接阿里云短信服务实现短信发 ...
- springboot集成阿里云短信服务,实现发送短信功能
springboot集成阿里云短信服务,实现发送短信功能 准备工作: 1.登陆阿里云->进入控制台->开通短信服务(进入后根据提示开通) 2.充值(借人家平台发短信你以为不要钱的?我充了3 ...
- SpringBoot集成阿里云存储OSS服务
前言 该文章会先简单的介绍一下阿里云的OSS存储,然后演示如何在SpringBoot项目中集成OSS,每一步都有记录,保证初学者也能看懂. 文章目录 前言 1.阿里云存储OSS是什么? 2.Sprin ...
- springBoot集成阿里云企业邮箱
前言 springboot项目,集成阿里云企业邮箱,进行邮件发送,附带文件 代码 public class AliyunMail {public static final String ALIDM_S ...
- java SpringBoot 集成 阿里云视频直播 完成直播功能
经历了几天的周折,近期才把项目完成,在这里与大家分享一下踩坑之路,也方便日后有类似项目,可以借阅一番 开发直播前先满足已下条件 1.开通视频直播功能 2.购买好了OSS存储 3.购买两个域名并且备案好 ...
- java SpringBoot 集成 阿里云视频直播 完成直播功能
经历了几天的周折,近期才把项目完成,在这里与大家分享一下踩坑之路,也方便日后有类似项目,可以借阅一番 该项目是一个H5直播,采用m3u8格式完成直播的展示.通过推流地址,借助第三方推流工具实现直播效果 ...
- springBOOT集成阿里云MQ-AMQP
序: MQ的优势就不做介绍了可以自行百度,前篇写了springboot集成本地搭建的rabbitmq组建,但是项目最后部署打算还是直接使用阿里云的AMQP,阿里云AMQP是直接可以兼容rabbitmq ...
- SpringBoot集成阿里云支付
阿里云支付 支付宝官方文档说明 https://opendocs.alipay.com/open/203/107091 开发准备 1.登录支付宝开发平台(支付宝账号) 地址: https://open ...
- springboot集成阿里云rocketMQ代码示例
集成目标:完成生产者发送消息,消费者接收消息的整个流程 集成步骤: 1.引入jar包依赖 <!--rocketMq消息队列--><dependency><groupId& ...
- SpringBoot集成阿里云短信服务实现登录注册(超详细)
本篇博客采用得技术为:springboot + redis + aliyun短信验证 redis我用来做短信校验,首先我们先刨除redis部分做一个发送功能 登录你得阿里云账号 1 -> 控制台 ...
最新文章
- 并发编程之多进程进程进程
- 重构手法(一)之重新组织函数
- [Python图像处理] 十.形态学之图像顶帽运算和黑帽运算
- SpringCloud版本名字
- 【OS学习笔记】十一 实模式:中断-软中断和硬中断基本原理
- Leetcode--1160.拼写单词(Java)
- Go搭建静态页面server笔记
- (18)FPGA时序逻辑与组合逻辑(第4天)
- Layui 是否开启合计行区域
- CSDN如何获取下载分以及进入下载频道必须知道的规则
- quartus ii IP核的破解
- CAN通讯进阶-基于Python使用dbc文件解析CAN数据(dbc文件的创建、使用方法)
- 免费下载IEEE、SCI论文的网站
- 陀螺仪-加速计-磁力计
- c语言求最小值函数min的用法,C语言--min的宏定义
- 在CAD软件中如何批量打印黑白CAD图纸
- python按概率生成随机数
- 【金三银四】 一文弄懂 js 数据类型、堆栈内存、作用域(链)、闭包知识拓展 (一)
- 为什么.bat脚本不断重复执行同一命令
- 数据库三大范式详解,部分依赖、完全依赖、传递依赖
热门文章
- 关于VM开启黑屏的解决方法
- 深度学习技术在股票交易上的应用研究调查
- Browsing HDFS报错
- 够哦了下攻击力开房间的发的goole
- Amazon AWS 中国区的那些坑
- 亲爱的面试官,这个我可没看过!(Android部分)
- win8.1打开网络上的计算机没有权限,Win8无网络访问权限_Win8无internet访问权限怎么解决-192路由网...
- 数字孪生--技术介绍
- 易捷行云EasyStack与火星高科完成产品互认证,保护云上数据
- 16个最新创意品牌Logo设计 —— “形神”兼具的设计,方显高级和质感