java 阿里云直播配置及推拉流地址获取

news2025/1/12 3:45:38

一、开通阿里云直播

  1. 首先进入阿里云直播产品主页:https://www.aliyun.com/product/live 。 点击下方的“立即开通”。 如果是还未注册的用户请按照页面提示进行完成注册并实名认证。

在这里插入图片描述

2、首次进入会提示开通服务,点击“开通服务”,然后选择计费方式,同意服务协议,然后立即开通。

  • 按使用流量计费适合用于观看直播人数较少的情况,
  • 宽带峰值计费适合用于观看人数较多的时候,如果不确定就按使用流量计费。
    在这里插入图片描述
    前期用量不太多,选择按“流量计费”
    在这里插入图片描述
    服务开通以后,按照官网流程,下一步就是 直播的基础配置:域名管理

在这里插入图片描述

二、接入推流域名

1、由于阿里云直播没有提供推流域名,所以我们要接入自己的推流域名。点击左侧“加速服务~添加域名”

在这里插入图片描述
2、按下图示例,根据自己的实际填写,然后提交。
在这里插入图片描述

3、返回“域名管理”,会看到刚才添加的推流域名,把域名右侧的“CNAME”值复制出来,到您的域名服务商处做解析。

在这里插入图片描述

在这里插入图片描述
4、配置完上一个步骤后,返回域名管理,稍等几分钟解析生效后会看到域名状态已经是“正常运行”。点击域名右侧的“域名配置”进入配置页面。

在这里插入图片描述

注意:建议先配置推流 。 因为后面在配置播流时要去关联推流,所以先配置

5、点击左侧的“访问控制”,然后修改URL鉴权配置,按下图示例填写,然后提交。
在这里插入图片描述
弹窗,修改配置
在这里插入图片描述

三、接入播流域名

前四步与接入推流域名的过程类似,就不再赘述

五、关联推流域名。 点击“基本配置~推流信息”

在这里插入图片描述

#######################分割线#######################

在这里插入图片描述
#######################分割线#######################
在这里插入图片描述

点“确定”。 确定完成之后,基本上我们的推流域名与播流域名就配置完成了 。

四、测试工具

完成了推流域名与播流域名的配置后, 可以通过阿里提供的工具来进行推/播流的生成了
点击左侧的 “工具箱~地址生成器”
在这里插入图片描述
#######################分割线#######################
在这里插入图片描述

五、 java代码生成推拉流地址

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.lang3.*;
public class Create_Live_Url { 

 /**
  * 计算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 void 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);
 }

/**
* 生成播放地址
* @param pullDomain 播放域名
* @param pullKey 播放鉴权Key
* @param appName 播放appName(同推流appName)
* @param streamName 播放streamName 同推流streamName)
* @param expireTime 过期时间(单位是秒
*/ 

public static void general_pull_url(String pullDomain,String pullKey,String appName,String streamName,long expireTime) {
  	String rtmpUrl = ""; //rtmp的拉流地址
  	String hlsUrl = "";  //m3u8的拉流地址
  	String flvUrl = "";  //flv的拉流地址
  	//播放域名未配置鉴权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);
}
 	
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 = "mxl-pull.pier39.cn";
  	String pullKey = "querty1234";
  
    String pushDomain = "mxl-push.pier39.cn";
  	String pushKey = "querty123";
  	Create_Live_Url.general_pull_url(pullDomain, pullKey, appName, streamName, expireTime);
  	Create_Live_Url.generate_push_url(pushDomain, pushKey, appName, streamName, expireTime);
}


} //end class

参考:https://help.aliyun.com/document_detail/456848.htm?spm=5176.13499635.help.dexternal.6b482699KJQJLs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/733008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C++] 万字 - C++异常处理分析介绍: 异常概念、异常抛出与捕获匹配原则、重新抛出、异常安全、异常体系...

C语言 错误处理方式 在C语言中, 代码发生错误一般会有两种处理方式: 终止程序. 比如 直接使用assert()断言. 或者直接崩溃 返回、设置错误码 C语言某些函数执行失败, 但是结果不足以导致致命问题时, 就会将错误码设置在errno中. 用户可以通过strerr(errno)来获取错误信息. …

Linux的管道符详解

&#xff08;该图由AI绘制 关注我 学习AI画图&#xff09; 目录 管道&#xff08;重点&#xff09; 1、管道符 2、过滤&#xff08;筛选&#xff09;功能 3、特殊功能&#xff08;了解&#xff09; 4、统计功能&#xff08;重点&#xff09; 5、xargs命令扩展 管道&…

多元分类预测 | Matlab全连接神经网络(DNN)分类预测,多特征输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 全连接神经网络(DNN)分类预测,多特征输入模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图。 部分源码

设计数据库时,字段“是否可用”该取什么英文名?研究active/enable/state/progress的区别

一条记录发布后&#xff0c;除了删除状态&#xff0c;还存在可用、不可用状态&#xff08;并非审核状态&#xff09;&#xff0c;那么这个字段在数据库中该取什么名字呢&#xff1f;先告诉结果&#xff1a;使用active英文单词衍生出的is_active。 表可用 active - 意为活跃或生…

Java经典面试题下包含答案

21.String、StringBuffer和StringBuilder的区别是什么&#xff1f; 线程安全&#xff1a; String中的对象是不可变的&#xff0c;线程安全StringBuffer对方法加了同步锁&#xff0c;所以是线程安全的StringBuilder没有对方法加同步锁&#xff0c;所以是非线程安全的 使用效率…

【STM32单片机】STM32控制SG90舵机的PWM部分参数的设置解答

STM32控制SG90舵机的PWM部分参数的设置解答 一、舵机控制要知道的知识二、PWM的参数要怎么计算1、为什么要分频呢&#xff1f;2、为什么选择TIM_OCMode_PWM1呢&#xff1f; 每天进步一点点 笔记仅供自学&#xff0c;用来回看复习&#xff0c;不一定适合你&#xff0c;如有错误请…

论青春线上书屋的设计与实现(论文+源码)_kaic

目 录 摘 要 III 第一章 绪论 1 1.1本课题研究背景与意义 1 1.2本课题国内外研究现状 1 第二章 开发技术介绍 3 2.1JDK的安装与配置 3 2.2HTML技术 3 2.3MySQL数据库管理系统 4 2.4JDBC的使用 4 第三章 系统分析 5 3.1系统的设计要求 5 3.2系…

交通 | 动态设施选址问题

论文解读 陈迎新&#xff0c;柯斯琪&#xff0c;曲晨辉&#xff0c;张景琪 编者按 本次解读的文章是Transportation Science 2017年的 《在日益增长的市场中&#xff0c;动态设施选址问题的连续逼近方法》&#xff08;Wang, X., Lim, M. K., & Ouyang, Y. (2017). A conti…

空元素不占用位置处理

一. 问题场景&#xff1a; 如果将一个元素的CSS设置为margin-right: 10px&#xff0c;即使这个元素为空&#xff0c;那么这10px依然存在&#xff0c;效果如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

【编译原理】词法分析程序设计(C语言)

目录 一、实验内容二、实验原理三、结果分析四、源代码一、实验内容 给定下表所示的一个简单语言的词法规则描述完成以下任务: (1)画出识别该语言词法规则的状态转换图; (2)依据状态转换图,设计并编制词法分析程序,实现从输入源程序中,识别出各类单词,即关键字、标识…

打工人如何利用自动化实现职场突围

作为优秀的打工人&#xff0c;如果可以将办公中的重复性、繁琐性、低效性工作自动化&#xff0c;那么将省去许多日常工作。许亚宁就是这样一个优秀的打工人&#xff0c;善于使用各类自动化工具来提升工作效率&#xff0c;上周的直播他分享了如何利用自动化工具&#xff0c;实现…

设计原则-依赖倒置原则

如同人体结构一样&#xff0c;项目代码也是需要有结构的&#xff0c;如原子逻辑块(不可再分代码块)、方法、类、模块等。结构要么是由成熟的框架搭建起来&#xff0c;要么自己手动划分&#xff0c;但是都需要保证下层模块的变动时不会影响上层模块。注意&#xff1a;这里所说的…

missing-semester————2

文章目录 shell 脚本赋值语法函数逻辑运算符命令替换进程替换通配 shell工具查看命令如何使用查找文件查找代码查找shell指令 shell 脚本 很多情况下需要执行一系列的操作并使用条件或循环这样的控制流。 大多数shell都有自己的一套脚本语言&#xff0c;包括变量、控制流和自…

006-Logstash、FileBeat、ELK整合详解

目录 ELK架构背景需求架构logstash核心概念配置文件结构插件Codec Plugin-Multiline输出&#xff1a;elasticsearch输入&#xff1a;jdbcGrok插件Grok语法 mutate插件Date插件 Logstash Queue Beats配置步骤 ELK整合步骤1&#xff1a;日志采集步骤2&#xff1a;配置Logstash接收…

ChatGLM2体验+ubuntu18.04LTS+CPU版本

ChatGPT在自然语言处理领域的表现让人振奋&#xff0c;开启了大模型在通用人工智能领域的大门。 许多工作随之跟进&#xff0c;并开源&#xff0c;凭借相对小的参数量达到近似GPT的效果&#xff0c;包括LLama&#xff0c;alpace等。 其中LLama训练语料主要选择英语&#xff0…

Docker内部工作原理:容器化背后的魔法

Docker内部工作原理是怎样的&#xff1f; 现在我们知道了Docker是什么以及它提供了哪些好处&#xff0c;让我们逐个重要的细节来了解。 什么是容器&#xff1f;它们是如何工作的&#xff1f; 在深入研究Docker的内部机制之前&#xff0c;我们首先要了解容器的概念。简单地说&am…

在工作与生活中保持情绪稳定的艺术

强烈的情绪波动&#xff1a;工作中的挑战 在我的职业生涯中&#xff0c;我经历过许多情绪波动的时刻。其中一个最具挑战性的时刻是在我负责一个重要项目的时候。我需要在短时间内完成大量的工作&#xff0c;同时还要管理一个由不同背景和技能的人组成的团队。这个项目的压力让…

leetcode-704. 二分查找

leetcode-704. 二分查找 文章目录 leetcode-704. 二分查找一.题目描述二.第1次代码提交(非二分查找)三.第2次代码提交(非二分查找&#xff0c;std::find和std::distance)四.第3次代码提交(二分查找)五.关于C中int型的奇数除以2 一.题目描述 二.第1次代码提交(非二分查找) clas…

Openlayers实战:drawstart,drawend 绘制交互应用示例

Openlayers地图中,绘制一个多边形是非常见的一个应用,涉及到交互会在绘制开始 drawstart 和绘制结束drawend时,通常会在绘制完成后取消继续绘制,然后提出feature的一些信息。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代…

B066-基础环境-前后端整合 批量删除 下拉 级联 增改

目录 批量删除页面调整普通属性的新增和修改引用属性的新增和修改管理员下拉列表部门树 见文档与代码 cd 子项目 运行前端项目 页面布局分析 批量删除 点击多选 - 改变data - 点击批量删除 - 带参数发请求 页面调整 略 普通属性的新增和修改 新增按钮&#xff1a;点击…