开通阿里云导播直播功能
接入阿里云三方直播平台,需要一个备过案的域名(有点烦,省事的话就问公司提供)
打开阿里云控制台 添加域名 这里要注意一下;添加的域名是二级域名
比如 推流域名: pushlive.xxx.com
拉流域名: pulllive.xxx.com
xxx.com就是你备过案的域名
添加域名进行域名之间一个关联,拉流域名与推流域名
地址生成器可以生成测试中对应的推流与拉流的地址:
AppName可以自己定义
StreamName 页面传过来的数据(这里可以自己定义一个)
格式大致如下:
推流地址:
rtmp://推流域名/shoplive/shopX5?auth_key=1590626986-0-0-85d0170b6b5bc885117a5c4f73e513d2
拉流地址(有三种拉流地址):
“flv”:“http://播流域名/shoplive/shopX5.flv?auth_key=1590626986-0-0-bb621d145c717e79293afde709f839e5”,
“rtm”:“rtmp://播流域名/shoplive/shopX5?auth_key=1590626986-0-0-85d0170b6b5bc885117a5c4f73e513d2”,
“m3u8”:“http://播流域名/shoplive/shopX5.m3u8?auth_key=1590626986-0-0-24d602ad55a5660e400cbda4014d1da3”
package com.shopx5.utils;
import com.alibaba.fastjson.JSONObject;
import com.shopx5.utils.alipay.MD5Util;
import java.util.HashMap;
import java.util.Map;
/**
*
* @Description: 阿里云直播推拉流地址工具类
*/
public class AliPlayAndPushUtils {
/**
* 推流域名 阿里云配置的推流域名
*/
private static final String pushDomain = "推流域名";
/**
* 拉流域名 阿里云配置的拉流域名
*/
private static final String pullDomain = " 拉流域名";
/**
* appName
* 随便取一个app名字:比如说 penggelive
*/
private static final String appName = "shoplive";
/**
* 鉴权key: 阿里云创建了推流域名和播流域名过后,他给生成的,每个域名一个,推流用推流的key,
* 播流用播流的key,我这里只有一个key,因为我自己定义的一个,然后去阿里云里面把他们两个的权鉴备用key都设置成我设置的了
*/
private static final String key = "key";
/**
* 根据阿里云模板id,配置拉流显示流畅度
* 如果没有配置模板,则将UDID 、LDID、SDID、HDID从代码中删除,否则会播流时不成功
*/
private static final String UDID = "_ud";//超高清
private static final String LDID = "_ld";//流畅
private static final String SDID = "_sd";//标清
private static final String HDID = "_hd";//高清
/**
* @param time 十位数的时间戳
* @return 推流的地址
*/
public static String CreatePushUrl(String streamName, long time) {
String strpush = "/" + appName + "/" + streamName + "-" + time + "-0-0-" + key;
String pushUrl = "rtmp://" + pushDomain + "/" + appName + "/" + streamName + "?auth_key=" + time + "-0-0-" + MD5Util.getMD5(strpush);
// System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>推流: " + pushUrl);
return pushUrl;
}
/**
* @param time 十位数的时间戳
* // * @param rand 这是用来标识的 否则同一个时间戳 生成的地址总是相同的
* 随机数,建议使用UUID(不能包含中划线“-”,例如: 477b3bbc253f467b8def6711128c7bec 格式)
* @return 播放流的地址 默认是flv 也可以更改此代码
*/
public static String GetPlayUrl(String streamName, long time) {
String strviewrtmp1 = null;
String strviewflv1 = null;
String strviewm3u81 = null;
String rtmpurl1 = null;
String flvurl1 = null;
String m3u8url1 = null;
strviewrtmp1 = "/" + appName + "/" + streamName + UDID + "-" + time + "-0-0-" + key;
strviewflv1 = "/" + appName + "/" + streamName + UDID + ".flv-" + time + "-0-0-" + key;
strviewm3u81 = "/" + appName + "/" + streamName + UDID +".m3u8-" + time + "-0-0-" + key;
rtmpurl1 = "rtmp://" + pullDomain + "/" + appName + "/" + streamName + UDID + "?auth_key=" + time + "-0-0-" + MD5Util.getMD5(strviewrtmp1);
flvurl1 = "http://" + pullDomain + "/" + appName + "/" + streamName + UDID + ".flv?auth_key=" + time + "-0-0-" + MD5Util.getMD5(strviewflv1);
m3u8url1 = "http://" + pullDomain + "/" + appName + "/" + streamName + UDID +".m3u8?auth_key=" + time + "-0-0-" + MD5Util.getMD5(strviewm3u81);
Map<String, String> resultMap = new HashMap<>(5);
resultMap.put("rtm", rtmpurl1);
resultMap.put("flv", flvurl1);
resultMap.put("m3u8", m3u8url1);
// System.out.println(">>>>>>>>>>>>>>>>>>拉流: " + rtmpurl1);
// System.out.println(">>>>>>>>>>>>>>>>>>拉流: " + flvurl1);
// System.out.println(">>>>>>>>>>>>>>>>>>拉流: " + m3u8url1);
return JSONObject.toJSONString(resultMap);
}
public static void main(String[] args) throws Exception {
Long longTime = DateUtils.longTodate();//有效时间
String pushUrl = CreatePushUrl("zh", longTime);
String playUrl = GetPlayUrl("zh", longTime);
System.out.println("推流地址====" + pushUrl);
System.out.println("拉流地址====" + playUrl);
}
}
package com.shopx5.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
/**
* 描述:公共日期工具类
*/
public class DateUtils {
/**
* 将北京时间转换为Unix时间,获取一个十位数的字符串
* 供直播推流、拉流使用
* @return
*/
public static Long longTodate() {
Date timeDate =null;
try {
//获取当前时间
long longTime = System.currentTimeMillis();
longTime+=30*1000*60*60;//在当前日期是增加3个小时。即有效时间3个小时
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
timeDate = df.parse(df.format(longTime));
} catch (Exception e) {
e.printStackTrace();
}
//将日期转换为十位数的纯数字字符串
long time = timeDate.getTime()/1000;
return time;
}
}
package com.shopx5.utils.alipay;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.UUID;
public class MD5Util{
//MD5加密 升序串:xx&xx&0.01key key=value, UTF-8
public static String MD5Encode(String origin, String charsetname){
String resultString = null;
try{
resultString = new String(origin);
//new一个MD5实例
MessageDigest md = MessageDigest.getInstance("MD5");
if(charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
} catch(Exception e){
e.printStackTrace();
}
return resultString;
}
//将MD5输出的二进制结果转换为小S写H的O十P六X进5制
private static String byteArrayToHexString(byte b[]){
StringBuffer resultSb = new StringBuffer();
for(int i = 0; i < b.length; i++){
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
private static String byteToHexString(byte b){
int n = b;
if(n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
private static final String hexDigits[] =
{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
public static String getMD5(String str) {
try {
// 生成一个MD5加密计算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 计算md5函数
md.update(str.getBytes());
// digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
String md5=new BigInteger(1, md.digest()).toString(16);
//BigInteger会把0省略掉,需补全至32位
return fillMD5(md5);
} catch (Exception e) {
throw new RuntimeException("MD5加密错误:"+e.getMessage(),e);
}
}
private static String fillMD5(String md5){
return md5.length()==32?md5:fillMD5("0"+md5);
}
public static String getUUID() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
public static void main(String[] args) {
System.out.println(MD5Encode("http://alipay?a=1&b=2&c=3", "UTF-8")); //ad8c2bb7fe0eb9efce8d2f17448bb50b
System.out.println(MD5Encode("http://alipay?a=1&b=2&c=3", "GBK")); //ad8c2bb7fe0eb9efce8d2f17448bb50b
}
}
链接:https://pan.baidu.com/s/1FH580XqozMUmDaE-cxKSPg
提取码:p6qt
安装成功之后,打开OBS