阿里云视频直播推流,视频录制工具类

视频推流地址生成工具类AliPlayAndPushUtils.class

public class AliPlayAndPushUtils {

    /**
     * 推流地址 rtmp://push.aliyunlive.com/app/stream?auth_key=1543302081-0-0-9c6e7c8190c10bdfb3c0************为例,
     * URL:填写rtmp://push.aliyunlive.com/app/,
     * 流名称:填写stream?auth_key=1543302081-0-0-9c6e7c8190c10bdfb3c0************
     * appName
     */
    private static final String appName = " ";
    /**
     * 鉴权key: 阿里云创建了推流域名和播流域名过后,他给生成的,每个域名一个,推流用推流的key,播流用播流的key,我这里只有一个key,因为我自己定义的一个,然后去阿里云里面把他们两个的权鉴备用key都设置成我设置的了
     */
    private static final String key = " ";

    /**
     * @param time       十位数的时间戳
     * @return 推流的地址
     */
    public static String CreatePushUrl(String streamName, long time,String rand,String pushDomain) {
        String strpush = "/" + appName + "/" + streamName + "-" + time + "-"+rand+"-0-" + key;
        String pushUrl = "rtmp://" + pushDomain + "/" + appName + "/" + streamName + "?auth_key=" + time + "-"+rand+"-0-"+MD5Util.md5(strpush);
        return pushUrl;
    }

    /**
     * @param time       十位数的时间戳
    //     * @param rand       这是用来标识的 否则同一个时间戳 生成的地址总是相同的  随机数,建议使用UUID(不能包含中划线“-”,例如: 477b3bbc253f467b8def6711128c7bec 格式)
     * @return 播放流的地址 默认是flv  也可以更改此代码
     */
    public static String GetPlayUrl(String streamName, long time,String rand,String pullDomain) {

        String strviewrtmp1 = null;
        String strviewflv1 = null;
        String strviewm3u81 = null;

        String rtmpurl1 = null;
        String flvurl1 = null;
        String m3u8url1 = null;

        strviewrtmp1 = "/" + appName + "/" + streamName + "-" + time + "-"+rand+"-0-" + key;
        strviewflv1 = "/" + appName + "/" + streamName + ".flv-" + time + "-"+rand+"-0-" + key;
        strviewm3u81 = "/" + appName + "/" + streamName + ".m3u8-" + time + "-"+rand+"-0-" + key;
        rtmpurl1 = "rtmp://" + pullDomain + "/" + appName + "/" + streamName + "?auth_key=" + time + "-"+rand+"-0-" +MD5Util.md5(strviewrtmp1);
        flvurl1 = "http://" + pullDomain + "/" + appName + "/" + streamName + ".flv?auth_key=" + time + "-"+rand+"-0-" + MD5Util.md5(strviewflv1);
        m3u8url1 = "http://" + pullDomain + "/" + appName + "/" + streamName + ".m3u8?auth_key=" + time + "-"+rand+"-0-" + MD5Util.md5(strviewm3u81);

        Map<String, String> resultMap = new HashMap<>(5);
        resultMap.put("rtmp", rtmpurl1);
        resultMap.put("flv", flvurl1);
        resultMap.put("m3u8", m3u8url1);
        return JSONObject.toJSONString(resultMap);
       
    }
    }

signature加密工具类AliSignatureUtils.calss

public class AliSignatureUtils {
    private static Logger logger = LoggerFactory.getLogger(AliSignatureUtils.class);

    public static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
    public static final String ALGORITHM = "HmacSHA1";
    public static final String ENCODING = "UTF-8";
    public static final String FORMAT_JSON = "JSON";
    public static final String FORMAT_XML = "XML";
    public static final String AccessKeyId = "";
    public static final String AccessKeySecret = "";
    public static final String SignatureMethod = "HMAC-SHA1";
    public static final String SignatureVersion = "1.0";

    public static String getSignature(Map<String, String> parameters) {
        String signature = "";
        try {
//            Map parameters = new HashMap();
//            parameters.put("Format", Format);
//            parameters.put("Version", VERSION);
//            parameters.put("AccessKeyId", AccessKeyId);
//            parameters.put("SignatureMethod", SignatureMethod);
//            parameters.put("Timestamp", Timestamp);
//            parameters.put("SignatureVersion", SignatureVersion);
//            parameters.put("SignatureNonce", SignatureNonce);
//
//            parameters.put("Action", OnlineUserNumAction);
//            parameters.put("DomainName", DomainName);
//            parameters.put("AppName", appName);
//            parameters.put("StreamName", streatName);
            // 对参数进行排序
            String[] sortedKeys = (String[]) parameters.keySet().toArray(new String[]{});
            Arrays.sort(sortedKeys);
            String SEPARATOR = "&";
            // 生成stringToSign字符串
            StringBuilder stringToSign = new StringBuilder();

            stringToSign.append("GET").append(SEPARATOR);

            stringToSign.append(percentEncode("/")).append(SEPARATOR);

            StringBuilder canonicalizedQueryString = new StringBuilder();

            for (String key : sortedKeys) {
                canonicalizedQueryString.append("&").append(percentEncode(key))
                        .append("=").append(percentEncode((String) parameters.get(key)));
            }
            // 这里注意对canonicalizedQueryString进行编码
            stringToSign.append(percentEncode(canonicalizedQueryString.toString()
                    .substring(1)));
            String key = AccessKeySecret + "&";
            Mac mac = Mac.getInstance(ALGORITHM);
            mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));
            byte[] signData = mac.doFinal(stringToSign.toString().getBytes(ENCODING));
            signature = new String(new BASE64Encoder().encode(signData));
            signature = percentEncode(signature);
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
        return signature;
    }

    private static String percentEncode(String value) throws UnsupportedEncodingException {
        return value != null ? URLEncoder.encode(value, "utf-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;
    }

    /*public static String getSignatureNonce() {
        return StringUtils.getRandomString3(20);
    }
*/
    public static String getTimeStamp(Date date) {
        SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
        df.setTimeZone(new SimpleTimeZone(0, "GMT"));
        return df.format(date);
    }
}

视频直播录制工具类AliLiveUtils.class

import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList;
import com.xm.redis.RedisClient;
import org.apache.commons.collections.MapUtils;
import org.apache.log4j.Logger;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

/**
 * 阿里云直播工具类
 *
 * @author lwg
 * @time 2018-03-14
 */
public class AliLiveUtils {

    private static Logger logger = Logger.getLogger(AliLiveUtils.class);
    private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    //推拉流配置
    private static final String PUSH_ADR_TEMPLATE = "rtmp://video-center.alivecdn.com/%s/%s?vhost=%s&auth_key=%s";
    private static final String PLAY_ADR_TEMPLATE = "%s://live.xiameikeji.com/%s/%s?auth_key=%s";
    private static final String KEY = "juyp6sG2I4";
    private static final String LIVE_HOST = " ";
    private static final String APP_NAME = "live";
    private static final String RTMP_PREFIX = "rtmp";
    private static final String FLV_PREFIX = "http";
    private static final String FLV_SUFFIX = ".flv";
    private static final String M3U8_PREFIX = "http";
    private static final String M3U8_SUFFIX = ".m3u8";

    //服务器配置
    public static final String LIVE_SERVER_HOST = "https://live.aliyuncs.com/";
    public static final String LIVE_VERSION = "2016-11-01";
    public static final String LIVE_OnlineUserNumAction = "DescribeLiveStreamOnlineUserNum";
    public static final String LIVE_RecordContent = "DescribeLiveStreamRecordContent";
    public static final String LIVE_ForbidLiveStream = "ForbidLiveStream";
    public static final String LIVE_ResumeLiveStream = "ResumeLiveStream";
    public static final String LIVE_RecordIndexFiles = "DescribeLiveStreamRecordIndexFiles";
    public static final String RECORD_PREFIX = "https://xiameilive.oss-cn-shanghai.aliyuncs.com/";

    private static String getAuthKey(String channel, long time) {
        String input = new StringBuilder()
                .append("/")
                .append(APP_NAME)
                .append("/")
                .append(channel)
                .append("-")
                .append(time)
                .append("-")
                .append("0")
                .append("-")
                .append("0")
                .append("-")
                .append(KEY)
                .toString();

        String authKey = null;

        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            authKey = byteArrayToHexString(
                    messageDigest.digest(input.getBytes("UTF-8")));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        authKey = authKey == null ? "" :
                new StringBuilder()
                        .append(time)
                        .append("-")
                        .append("0")
                        .append("-")
                        .append("0")
                        .append("-")
                        .append(authKey).
                        toString();
        return authKey;
    }

    private static String byteArrayToHexString(byte[] data) {
        char[] out = new char[data.length << 1];

        for (int i = 0, j = 0; i < data.length; i++) {
            out[j++] = DIGITS_LOWER[(0xF0 & data[i]) >>> 4];
            out[j++] = DIGITS_LOWER[0x0F & data[i]];
        }
        return new String(out);
    }


    /**
     * 获取推流地址
     *
     * @param channel 频道号
     * @return
     */
    public static String getPushAdr(String channel) {
        String authKey = getAuthKey(channel, new Date().getTime() / 1000);
        return String.format(PUSH_ADR_TEMPLATE, APP_NAME, channel, LIVE_HOST, authKey);
    }

    /**
     * 获取播放地址
     *
     * @param channel 频道号
     * @param type    播放类型 0:RTMP 1:FLV 2:M3U8
     * @return
     */
    public static String getPlayAdr(String channel, Integer type) {
        String prefix = null;
        if (type == 0) {
            prefix = RTMP_PREFIX;
        } else if (type == 1) {
            channel += FLV_SUFFIX;
            prefix = FLV_PREFIX;
        } else if (type == 2) {
            channel += M3U8_SUFFIX;
            prefix = M3U8_PREFIX;
        }
        long time = new Date().getTime() / 1000;
        String authKey = getAuthKey(channel, time);
        String playAdr = String.format(PLAY_ADR_TEMPLATE, prefix, APP_NAME, channel, authKey);
        return playAdr;
    }

    /**
     * 查询在线人数
     *
     * @param channel
     */
    public static Integer getOnlineNum(String channel) {
        //真实数据
        /*Integer online = 0;
        try {
            StringBuffer params = new StringBuffer();
            String signatureNonce = AliSignatureUtils.getSignatureNonce();
            String UTCTimeStr = AliSignatureUtils.getTimeStamp(new Date());

            Map parameters = new HashMap();
            //公共参数
            parameters.put("Format", AliSignatureUtils.FORMAT_JSON);
            parameters.put("Version", LIVE_VERSION);
            parameters.put("AccessKeyId", AliSignatureUtils.AccessKeyId);
            parameters.put("SignatureMethod", AliSignatureUtils.SignatureMethod);
            parameters.put("SignatureVersion", AliSignatureUtils.SignatureVersion);
            parameters.put("SignatureNonce", signatureNonce);
            parameters.put("Timestamp", UTCTimeStr);
            //接口参数
            parameters.put("Action", LIVE_OnlineUserNumAction);
            parameters.put("DomainName", LIVE_HOST);
            parameters.put("AppName", APP_NAME);
            parameters.put("StreamName", channel);

            String signature = AliSignatureUtils.getSignature(parameters);
            params.append("Format=" + AliSignatureUtils.FORMAT_JSON)
                    .append("&Version=" + LIVE_VERSION)
                    .append("&AccessKeyId=" + AliSignatureUtils.AccessKeyId)
                    .append("&SignatureMethod=" + AliSignatureUtils.SignatureMethod)
                    .append("&SignatureVersion=" + AliSignatureUtils.SignatureVersion)
                    .append("&SignatureNonce=" + signatureNonce)
                    .append("&Timestamp=" + UTCTimeStr)
                    .append("&DomainName=" + LIVE_HOST)
                    .append("&Action=" + LIVE_OnlineUserNumAction)
                    .append("&AppName=" + APP_NAME)
                    .append("&StreamName=" + channel)
                    .append("&Signature=" + signature);
            logger.info("url===" + LIVE_SERVER_HOST + "?" + params.toString());
            String resJson = HttpRequestUtils.sendGet(LIVE_SERVER_HOST, params.toString());
            Map<String, Object> resMap = JsonUtils.json2Map(resJson);
            online = MapUtils.getInteger(resMap, "TotalUserNumber");
            logger.info("result==>" + resJson);
        } catch (Exception e) {
            logger.error("查询在线人数失败", e);
        }
        return online;*/
        //虚拟数据
        return getOnlineNumByRandom(channel);
    }

    /**
     * 禁止直播流推送
     *
     * @param channel
     */
    public static void forbidLiveStream(String channel) {
        try {
            StringBuffer params = new StringBuffer();
            String signatureNonce = AliSignatureUtils.getSignatureNonce();
            String UTCTimeStr = AliSignatureUtils.getTimeStamp(new Date());

            Map parameters = new HashMap();
            //公共参数
            parameters.put("Format", AliSignatureUtils.FORMAT_JSON);
            parameters.put("Version", LIVE_VERSION);
            parameters.put("AccessKeyId", AliSignatureUtils.AccessKeyId);
            parameters.put("SignatureMethod", AliSignatureUtils.SignatureMethod);
            parameters.put("SignatureVersion", AliSignatureUtils.SignatureVersion);
            parameters.put("SignatureNonce", signatureNonce);
            parameters.put("Timestamp", UTCTimeStr);
            //接口参数
            parameters.put("Action", LIVE_ForbidLiveStream);
            parameters.put("DomainName", LIVE_HOST);
            parameters.put("AppName", APP_NAME);
            parameters.put("LiveStreamType", "publisher");
            parameters.put("StreamName", channel);

            String signature = AliSignatureUtils.getSignature(parameters);
            params.append("Format=" + AliSignatureUtils.FORMAT_JSON)
                    .append("&Version=" + LIVE_VERSION)
                    .append("&AccessKeyId=" + AliSignatureUtils.AccessKeyId)
                    .append("&SignatureMethod=" + AliSignatureUtils.SignatureMethod)
                    .append("&SignatureVersion=" + AliSignatureUtils.SignatureVersion)
                    .append("&SignatureNonce=" + signatureNonce)
                    .append("&Timestamp=" + UTCTimeStr)
                    .append("&Action=" + LIVE_ForbidLiveStream)
                    .append("&DomainName=" + LIVE_HOST)
                    .append("&AppName=" + APP_NAME)
                    .append("&LiveStreamType=" + "publisher")
                    .append("&StreamName=" + channel)
                    .append("&Signature=" + signature);
            logger.info("url===" + LIVE_SERVER_HOST + "?" + params.toString());
            String resJson = HttpRequestUtils.sendGet(LIVE_SERVER_HOST, params.toString());
            Map<String, Object> resMap = JsonUtils.json2Map(resJson);
            logger.info("result==>" + resJson);

            clearOnlineNum(channel);
        } catch (Exception e) {
            logger.error("禁止直播流推送", e);
        }
    }

    /**
     * 恢复直播推流
     *
     * @param channel
     */
    public static void resumeLiveStream(String channel) {
        try {
            StringBuffer params = new StringBuffer();
            String signatureNonce = AliSignatureUtils.getSignatureNonce();
            String UTCTimeStr = AliSignatureUtils.getTimeStamp(new Date());

            Map parameters = new HashMap();
            //公共参数
            parameters.put("Format", AliSignatureUtils.FORMAT_JSON);
            parameters.put("Version", LIVE_VERSION);
            parameters.put("AccessKeyId", AliSignatureUtils.AccessKeyId);
            parameters.put("SignatureMethod", AliSignatureUtils.SignatureMethod);
            parameters.put("SignatureVersion", AliSignatureUtils.SignatureVersion);
            parameters.put("SignatureNonce", signatureNonce);
            parameters.put("Timestamp", UTCTimeStr);
            //接口参数
            parameters.put("Action", LIVE_ResumeLiveStream);
            parameters.put("DomainName", LIVE_HOST);
            parameters.put("AppName", APP_NAME);
            parameters.put("LiveStreamType", "publisher");
            parameters.put("StreamName", channel);

            String signature = AliSignatureUtils.getSignature(parameters);
            params.append("Format=" + AliSignatureUtils.FORMAT_JSON)
                    .append("&Version=" + LIVE_VERSION)
                    .append("&AccessKeyId=" + AliSignatureUtils.AccessKeyId)
                    .append("&SignatureMethod=" + AliSignatureUtils.SignatureMethod)
                    .append("&SignatureVersion=" + AliSignatureUtils.SignatureVersion)
                    .append("&SignatureNonce=" + signatureNonce)
                    .append("&Timestamp=" + UTCTimeStr)
                    .append("&Action=" + LIVE_ResumeLiveStream)
                    .append("&DomainName=" + LIVE_HOST)
                    .append("&AppName=" + APP_NAME)
                    .append("&LiveStreamType=" + "publisher")
                    .append("&StreamName=" + channel)
                    .append("&Signature=" + signature);
            logger.info("url===" + LIVE_SERVER_HOST + "?" + params.toString());
            String resJson = HttpRequestUtils.sendGet(LIVE_SERVER_HOST, params.toString());
            Map<String, Object> resMap = JsonUtils.json2Map(resJson);
            logger.info("result==>" + resJson);
        } catch (Exception e) {
            logger.error("恢复直播推流失败", e);
        }
    }

    /**
     * 获取直播录制文件(OSS)
     *
     * @param channel
     * @return
     */
//    public static List<String> getFileList(String channel) {
//        String fileName = null;
//        try {
//            String catalog = String.format(OSSUtil.LIVE_CATALOG_TEMPLATE, APP_NAME, channel);
//            List<String> fileListByEndpoint = OSSUtil.getFileListByEndpoint(OSSUtil.SHANGHAI_ENDPOINT, OSSUtil.LIVE_BUCKET, catalog);
//            List<String> fileList = new ArrayList<>();
//            String temp;
//            for (String url : fileListByEndpoint) {
//                temp = "https://xiameilive.oss-cn-shanghai.aliyuncs.com/" + url;
//                fileList.add(temp);
//            }
//            fileListByEndpoint = null;
//            temp = null;
//            return fileList;
//            //fileName = JsonUtils.listToJson(fileList);
//        } catch (Exception e) {
//            logger.error("查询录制文件失败", e);
//            return null;
//        }
//    }
    public static List<Map<String, Object>> getFileListByLiveApi(String channel, Date actualStartTime) {
        try {
            List<Map<String, Object>> resultList = new ArrayList<>();
            if (actualStartTime == null) {
                return resultList;
            }
            StringBuffer params = new StringBuffer();
            String signatureNonce = AliSignatureUtils.getSignatureNonce();
            String UTCTimeStr = AliSignatureUtils.getTimeStamp(new Date());
            String startTime = AliSignatureUtils.getTimeStamp(actualStartTime);
            Calendar c = Calendar.getInstance();
            c.setTime(actualStartTime);
            c.add(Calendar.DAY_OF_YEAR, 3);
            String endTime = AliSignatureUtils.getTimeStamp(c.getTime());

            Map parameters = new HashMap();
            //公共参数
            parameters.put("Format", AliSignatureUtils.FORMAT_JSON);
            parameters.put("Version", LIVE_VERSION);
            parameters.put("AccessKeyId", AliSignatureUtils.AccessKeyId);
            parameters.put("SignatureMethod", AliSignatureUtils.SignatureMethod);
            parameters.put("SignatureVersion", AliSignatureUtils.SignatureVersion);
            parameters.put("SignatureNonce", signatureNonce);
            parameters.put("Timestamp", UTCTimeStr);
            //接口参数
            parameters.put("Action", LIVE_RecordIndexFiles);
            parameters.put("DomainName", LIVE_HOST);
            parameters.put("AppName", APP_NAME);
            parameters.put("StreamName", channel);
            parameters.put("StartTime", startTime);
            parameters.put("EndTime", endTime);

            String signature = AliSignatureUtils.getSignature(parameters);
            params.append("Format=" + AliSignatureUtils.FORMAT_JSON)
                    .append("&Version=" + LIVE_VERSION)
                    .append("&AccessKeyId=" + AliSignatureUtils.AccessKeyId)
                    .append("&SignatureMethod=" + AliSignatureUtils.SignatureMethod)
                    .append("&SignatureVersion=" + AliSignatureUtils.SignatureVersion)
                    .append("&SignatureNonce=" + signatureNonce)
                    .append("&Timestamp=" + UTCTimeStr)
                    .append("&Action=" + LIVE_RecordIndexFiles)
                    .append("&DomainName=" + LIVE_HOST)
                    .append("&AppName=" + APP_NAME)
                    .append("&StreamName=" + channel)
                    .append("&StartTime=" + startTime)
                    .append("&EndTime=" + endTime)
                    .append("&Signature=" + signature);
            logger.info("url===" + LIVE_SERVER_HOST + "?" + params.toString());
            String resJson = HttpRequestUtils.sendGet(LIVE_SERVER_HOST, params.toString());
            logger.info("result==>" + resJson);
            Map<String, Object> resMap = JsonUtils.json2Map(resJson);
            if (resMap != null) {
                Map<String, Object> recordIndexInfoList = MapUtils.getMap(resMap, "RecordIndexInfoList");
                List<Map<String, Object>> recordIndexInfo = (List<Map<String, Object>>) recordIndexInfoList.get("RecordIndexInfo");
                for (Map<String, Object> map : recordIndexInfo) {
                    Map<String, Object> temp = new HashMap<>();
                    //temp.put("fileName", RECORD_PREFIX + MapUtils.getString(map, "OssObject"));
                    temp.put("fileName", MapUtils.getString(map, "RecordUrl"));
                    Date ISOStartTime = DateUtiles.stringToDate(MapUtils.getString(map, "StartTime"), Constant.ISO8601_DATE_FORMAT);
                    temp.put("startTime", DateUtiles.dateToString(ISOStartTime, Constant.TIME_FORMAT));
                    Date ISOEndTime = DateUtiles.stringToDate(MapUtils.getString(map, "EndTime"), Constant.ISO8601_DATE_FORMAT);
                    temp.put("endTime", DateUtiles.dateToString(ISOEndTime, Constant.TIME_FORMAT));
                    temp.put("duration", MapUtils.getObject(map, "Duration") + "");
                    resultList.add(temp);
                }
            }
            resMap = null;
            return resultList;
        } catch (Exception e) {
            logger.error("恢复直播推流失败", e);
        }
        return null;
    }

    //FIXME
    private static void addLiveRecordNotifyConfig() {
        try {
            StringBuffer params = new StringBuffer();
            String signatureNonce = AliSignatureUtils.getSignatureNonce();
            String UTCTimeStr = AliSignatureUtils.getTimeStamp(new Date());

            String action = "AddLiveRecordNotifyConfig";

            Map parameters = new HashMap();
            //公共参数
            parameters.put("Format", AliSignatureUtils.FORMAT_JSON);
            parameters.put("Version", LIVE_VERSION);
            parameters.put("AccessKeyId", AliSignatureUtils.AccessKeyId);
            parameters.put("SignatureMethod", AliSignatureUtils.SignatureMethod);
            parameters.put("SignatureVersion", AliSignatureUtils.SignatureVersion);
            parameters.put("SignatureNonce", signatureNonce);
            parameters.put("Timestamp", UTCTimeStr);
            //接口参数
            parameters.put("Action", action);
            parameters.put("DomainName", LIVE_HOST);
            parameters.put("NotifyUrl", Constant.DOMAIN_NAME + "/ali/live/record.json");//回调 url 地址。需要做 url encode
            parameters.put("NeedStatusNotify", "false");//是否需要录制任务状态回调

            String signature = AliSignatureUtils.getSignature(parameters);
            params.append("Format=" + AliSignatureUtils.FORMAT_JSON)
                    .append("&Version=" + LIVE_VERSION)
                    .append("&AccessKeyId=" + AliSignatureUtils.AccessKeyId)
                    .append("&SignatureMethod=" + AliSignatureUtils.SignatureMethod)
                    .append("&SignatureVersion=" + AliSignatureUtils.SignatureVersion)
                    .append("&SignatureNonce=" + signatureNonce)
                    .append("&Timestamp=" + UTCTimeStr)
                    .append("&Action=" + action)
                    .append("&DomainName=" + LIVE_HOST)
                    .append("&NotifyUrl=" + Constant.DOMAIN_NAME + "/ali/live/record.json")
                    .append("&NeedStatusNotify=" + "false")
                    .append("&Signature=" + signature);
            logger.info("url===" + LIVE_SERVER_HOST + "?" + params.toString());
            String resJson = HttpRequestUtils.sendGet(LIVE_SERVER_HOST, params.toString());
            Map<String, Object> resMap = JsonUtils.json2Map(resJson);
            logger.info("result==>" + resJson);
        } catch (Exception e) {
            logger.error("添加录制回调配置", e);
        }
    }

    //FIXME
    private static void deleteLiveRecordNotifyConfig() {
        try {
            StringBuffer params = new StringBuffer();
            String signatureNonce = AliSignatureUtils.getSignatureNonce();
            String UTCTimeStr = AliSignatureUtils.getTimeStamp(new Date());

            String action = "DeleteLiveRecordNotifyConfig";

            Map parameters = new HashMap();
            //公共参数
            parameters.put("Format", AliSignatureUtils.FORMAT_JSON);
            parameters.put("Version", LIVE_VERSION);
            parameters.put("AccessKeyId", AliSignatureUtils.AccessKeyId);
            parameters.put("SignatureMethod", AliSignatureUtils.SignatureMethod);
            parameters.put("SignatureVersion", AliSignatureUtils.SignatureVersion);
            parameters.put("SignatureNonce", signatureNonce);
            parameters.put("Timestamp", UTCTimeStr);
            //接口参数
            parameters.put("Action", action);
            parameters.put("DomainName", LIVE_HOST);

            String signature = AliSignatureUtils.getSignature(parameters);
            params.append("Format=" + AliSignatureUtils.FORMAT_JSON)
                    .append("&Version=" + LIVE_VERSION)
                    .append("&AccessKeyId=" + AliSignatureUtils.AccessKeyId)
                    .append("&SignatureMethod=" + AliSignatureUtils.SignatureMethod)
                    .append("&SignatureVersion=" + AliSignatureUtils.SignatureVersion)
                    .append("&SignatureNonce=" + signatureNonce)
                    .append("&Timestamp=" + UTCTimeStr)
                    .append("&Action=" + action)
                    .append("&DomainName=" + LIVE_HOST)
                    .append("&Signature=" + signature);
            logger.info("url===" + LIVE_SERVER_HOST + "?" + params.toString());
            String resJson = HttpRequestUtils.sendGet(LIVE_SERVER_HOST, params.toString());
            Map<String, Object> resMap = JsonUtils.json2Map(resJson);
            logger.info("result==>" + resJson);
        } catch (Exception e) {
            logger.error("删除录制回调配置", e);
        }
    }

    //FIXME
    private static void getLiveRecordNotifyConfig() {
        try {
            StringBuffer params = new StringBuffer();
            String signatureNonce = AliSignatureUtils.getSignatureNonce();
            String UTCTimeStr = AliSignatureUtils.getTimeStamp(new Date());

            String action = "DescribeLiveRecordNotifyConfig";

            Map parameters = new HashMap();
            //公共参数
            parameters.put("Format", AliSignatureUtils.FORMAT_JSON);
            parameters.put("Version", LIVE_VERSION);
            parameters.put("AccessKeyId", AliSignatureUtils.AccessKeyId);
            parameters.put("SignatureMethod", AliSignatureUtils.SignatureMethod);
            parameters.put("SignatureVersion", AliSignatureUtils.SignatureVersion);
            parameters.put("SignatureNonce", signatureNonce);
            parameters.put("Timestamp", UTCTimeStr);
            //接口参数
            parameters.put("Action", action);
            parameters.put("DomainName", LIVE_HOST);

            String signature = AliSignatureUtils.getSignature(parameters);
            params.append("Format=" + AliSignatureUtils.FORMAT_JSON)
                    .append("&Version=" + LIVE_VERSION)
                    .append("&AccessKeyId=" + AliSignatureUtils.AccessKeyId)
                    .append("&SignatureMethod=" + AliSignatureUtils.SignatureMethod)
                    .append("&SignatureVersion=" + AliSignatureUtils.SignatureVersion)
                    .append("&SignatureNonce=" + signatureNonce)
                    .append("&Timestamp=" + UTCTimeStr)
                    .append("&Action=" + action)
                    .append("&DomainName=" + LIVE_HOST)
                    .append("&Signature=" + signature);
            logger.info("url===" + LIVE_SERVER_HOST + "?" + params.toString());
            String resJson = HttpRequestUtils.sendGet(LIVE_SERVER_HOST, params.toString());
            Map<String, Object> resMap = JsonUtils.json2Map(resJson);
            logger.info("result==>" + resJson);
        } catch (Exception e) {
            logger.error("删除录制回调配置", e);
        }
    }

    //FIXME
    private static void updateLiveRecordNotifyConfig() {
        try {
            StringBuffer params = new StringBuffer();
            String signatureNonce = AliSignatureUtils.getSignatureNonce();
            String UTCTimeStr = AliSignatureUtils.getTimeStamp(new Date());

            String action = "UpdateLiveRecordNotifyConfig";

            Map parameters = new HashMap();
            //公共参数
            parameters.put("Format", AliSignatureUtils.FORMAT_JSON);
            parameters.put("Version", LIVE_VERSION);
            parameters.put("AccessKeyId", AliSignatureUtils.AccessKeyId);
            parameters.put("SignatureMethod", AliSignatureUtils.SignatureMethod);
            parameters.put("SignatureVersion", AliSignatureUtils.SignatureVersion);
            parameters.put("SignatureNonce", signatureNonce);
            parameters.put("Timestamp", UTCTimeStr);
            //接口参数
            parameters.put("Action", action);
            parameters.put("DomainName", LIVE_HOST);
            parameters.put("AppName", APP_NAME);
            parameters.put("NotifyUrl", Constant.DOMAIN_NAME + "/ali/live/recordSuccess.json");//回调 url 地址。需要做 url encode
            parameters.put("NeedStatusNotify", "false");//是否需要录制任务状态回调

            String signature = AliSignatureUtils.getSignature(parameters);
            params.append("Format=" + AliSignatureUtils.FORMAT_JSON)
                    .append("&Version=" + LIVE_VERSION)
                    .append("&AccessKeyId=" + AliSignatureUtils.AccessKeyId)
                    .append("&SignatureMethod=" + AliSignatureUtils.SignatureMethod)
                    .append("&SignatureVersion=" + AliSignatureUtils.SignatureVersion)
                    .append("&SignatureNonce=" + signatureNonce)
                    .append("&Timestamp=" + UTCTimeStr)
                    .append("&Action=" + action)
                    .append("&DomainName=" + LIVE_HOST)
                    .append("&AppName=" + APP_NAME)
                    .append("&NotifyUrl=" + Constant.DOMAIN_NAME + "/ali/live/recordSuccess.json")
                    .append("&NeedStatusNotify=" + "false")
                    .append("&Signature=" + signature);
            logger.info("url===" + LIVE_SERVER_HOST + "?" + params.toString());
            String resJson = HttpRequestUtils.sendGet(LIVE_SERVER_HOST, params.toString());
            Map<String, Object> resMap = JsonUtils.json2Map(resJson);
            logger.info("result==>" + resJson);
        } catch (Exception e) {
            logger.error("删除录制回调配置", e);
        }
    }

    /**
     * 虚拟在线人数
     *
     * @param channel
     * @return
     */
    private static int getOnlineNumByRandom(String channel) {
        Integer num = 0;

        String redisKey = Constant.REDIS_KEY_LIVE_ONLINE_NUM + channel;
        int random = new Random().nextInt(4) + 1;
        String temp = RedisClient.get(redisKey);
        if (temp != null) {
            num = Integer.valueOf(temp) + random;
        } else {
            num = random;
        }
        RedisClient.set(redisKey, num + "", 60 * 60);
        return num;
    }

    /**
     * 清除虚拟在线人数
     *
     * @param channel
     */
    private static void clearOnlineNum(String channel) {
        RedisClient.del(Constant.REDIS_KEY_LIVE_ONLINE_NUM + channel);
    }

    public static void main(String[] args) throws Exception {
        String channel = "123456";
        //推拉流
//        String pushAdr = getPushAdr(channel);
//        System.out.println("pushAdr");
//        System.out.println(pushAdr);
////
//        String playAdr = getPlayAdr(channel, 0);
//        System.out.println("playAdr");
//        System.out.println(playAdr);

//        String playAdr2 = getPlayAdr(channel, 1);
//        System.out.println("playAdr2");
//        System.out.println(playAdr2);
//
//        String playAdr3 = getPlayAdr(channel, 2);
//        System.out.println("playAdr3");
//        System.out.println(playAdr3);

        //测试在线人数
//        while (true) {
//            Thread.sleep(20000);
//            Integer onlineNum = getOnlineNum(channel);
//            System.out.println(onlineNum);
//        }

//        获取录制文件
//        Date date = DateUtiles.stringToDate("2018-03-20 12:00:00", Constant.TIME_FORMAT);
//        List<String> aV1Pdteb = getFileList("aV1Pdteb");
//        for (String s:aV1Pdteb) {
//            System.out.println(s);
//        }

//        禁止推流
        forbidLiveStream(channel);
//        resumeLiveStream(channel);

        //查询录制内容,无法获取文件

//        while (true){
//            List<Map<String, Object>> fileListByLiveApi = getFileListByLiveApi(channel, DateUtiles.stringToDate("2018-05-07 00:00:00", Constant.TIME_FORMAT));
//            for (Map<String, Object> map : fileListByLiveApi) {
//                System.out.println(JsonUtils.mapToJson(map));
//            }
//            Thread.sleep(5000);
//        }


        //配置录制回调
//        addLiveRecordNotifyConfig();
//        getLiveRecordNotifyConfig();
//        deleteLiveRecordNotifyConfig();
    }
}

发布了72 篇原创文章 · 获赞 21 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_39513430/article/details/104063621