电商直播带货功能接入阿里云第三方实现

  • 开通阿里云导播直播功能

  • 接入阿里云三方直播平台,需要一个备过案的域名(有点烦,省事的话就问公司提供)

  • 打开阿里云控制台 添加域名 这里要注意一下;添加的域名是二级域名
    比如 推流域名: pushlive.xxx.com
    拉流域名: pulllive.xxx.com
    xxx.com就是你备过案的域名

  • 添加域名进行域名之间一个关联,拉流域名与推流域名

电商直播带货功能接入阿里云第三方实现_第1张图片

  • 地址生成器可以生成测试中对应的推流与拉流的地址:
    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”

电商直播带货功能接入阿里云第三方实现_第2张图片

  • 阿里云控制台操作完之后;奉上我写的代码;如下按照阿里云给的格式去拼接生成推流与拉流的地址
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);
    }
}
  • 鉴权key,拉流与推流的key保持一致,如

推流
电商直播带货功能接入阿里云第三方实现_第3张图片
播流
电商直播带货功能接入阿里云第三方实现_第4张图片

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
	}
	
}



  • 安装推流工具OBS,进行推流操作即直播;下载地址如下

链接:https://pan.baidu.com/s/1FH580XqozMUmDaE-cxKSPg
提取码:p6qt
安装成功之后,打开OBS
电商直播带货功能接入阿里云第三方实现_第5张图片

  • 点击OBS下方窗口“来源”-----》+,选择显示器捕获,点击确认如图(这个自己需要设置即可)

电商直播带货功能接入阿里云第三方实现_第6张图片

  • 点击设置-----》推流,将推流地址填入下方中,(格式不要错)如图:
  • 电商直播带货功能接入阿里云第三方实现_第7张图片
  • 点击确认
  • 点击开始推流
  • 电商直播带货功能接入阿里云第三方实现_第8张图片
  • 观看直播,即需要将生成的拉流地址复制到拉流工具中;如:这里使用LVC(这个自己选择);打开LVC----》媒体-----》打开网络串流,将地址复制上去,点击播放既可以观看
  • 电商直播带货功能接入阿里云第三方实现_第9张图片
    电商直播带货功能接入阿里云第三方实现_第10张图片

你可能感兴趣的:(java)