本教程为您详细介绍如何进行直播鉴权。

前提条件

本文代码示例使用第三方工具包进行直播鉴权,所需maven依赖如下:
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.0.2</version>
</dependency>

代码示例

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import java.util.HashMap;
import java.util.Map;

/**
 * 推拉流地址示例:
 * rtmp://www.ttest.liveTest.com/a/a?auth_key=1558065152-0-0-c3cb54d946c0590ca9aeee63573201ee
 * 播流地址
 * 原画
 * rtmp://www.btest.liveTest.com/a/a?auth_key=1558065152-0-0-fc711455c0815aeb581385f33451d5b4
 * http://www.btest.liveTest.com/a/a.flv?auth_key=1558065152-0-0-221abff1da1ee32151e365cf0dd42a53
 * http://www.btest.liveTest.com/a/a.m3u8?auth_key=1558065152-0-0-72124fcc3aee3404b0d65dcc114e207f
 */
public class AliyunLiveUtil {

    // 鉴权url的有效时间(秒),默认30分钟,1800秒
    private static Integer identUrlValidTime = 1800;
    // 直播测试appName
    private static String appName = "testApp";
    // 直播测试streamName
    private static String streamName = "testStranm";
    // 推流域名
    private static String pushDomain = "videolive1.aliyuntest.club";
    // 推流鉴权url
    private static String pushIdentKey = "X6e8AJnTqH";
    // 拉流域名
    private static String pullDomain = "videolive2.aliyuntest.club";
    // 拉流鉴权url
    private static String pullIdentKey = "X6e8AJnTqH";

    /**
     * 根据源id创建该id的推流url
     *
     * @param identUrlValidTime 鉴权url的有效时间(秒),默认30分钟,1800秒
     * @param pushDomain        推流域名
     * @param appName           直播测试appName
     * @param streamName        直播测试streamName
     * @param pushIdentKey      推流鉴权url key
     * @return
     */
    public String createPushUrl(Integer identUrlValidTime, String pushDomain, String appName, String streamName, String pushIdentKey) {
        // 计算过期时间
        String timestamp = String.valueOf((System.currentTimeMillis() / 1000) + identUrlValidTime);
        // 组合推流域名前缀
        // rtmp://{pushDomain}/{appName}/{streamName}
        String rtmpUrl = StrUtil.format("rtmp://{}/{}/{}", pushDomain, appName, streamName);
        System.out.println("推流域名前缀,rtmpUrl=" + rtmpUrl);

        // 组合md5加密串
        // /{appName}/{streamName}-{timestamp}-0-0-{pushIdentKey}
        String md5Url = StrUtil.format("/{}/{}-{}-0-0-{}", appName, streamName, timestamp, pushIdentKey);

        // md5加密
        String md5Str = DigestUtil.md5Hex(md5Url);
        System.out.println("md5加密串,md5Url=" + md5Url + "------md5加密结果,md5Str = " + md5Str);

        // 组合最终鉴权过的推流域名
        // {rtmpUrl}?auth_key={timestamp}-0-0-{md5Str}
        String finallyPushUrl = StrUtil.format("{}?auth_key={}-0-0-{}", rtmpUrl, timestamp, md5Str);
        System.out.println("最终鉴权过的推流域名=" + finallyPushUrl);

        return finallyPushUrl;
    }

    /**
     * 创建拉流域名,key=rtmpUrl、flvUrl、m3u8Url,代表三种拉流类型域名
     *
     * @param pullDomain        拉流域名
     * @param appName           应用名称
     * @param streamName        流名称
     * @param pullIdentKey      拉流鉴权url key
     * @param identUrlValidTime 鉴权url的有效时间(秒),默认30分钟,1800秒
     * @return
     */
    public Map<String, String> createPullUrl(String pullDomain, String appName, String streamName, String pullIdentKey, Integer identUrlValidTime) {

        // 计算过期时间
        String timestamp = String.valueOf((System.currentTimeMillis() / 1000) + identUrlValidTime);

        // 组合通用域名
        // {pullDomain}/{appName}/{streamName}
        String pullUrl = StrUtil.format("{}/{}/{}", pullDomain, appName, streamName);
        System.out.println("组合通用域名,pullUrl=" + pullUrl);

        // 组合md5加密串
        // /{appName}/{streamName}-{timestamp}-0-0-{pullIdentKey}
        String md5Url = StrUtil.format("/{}/{}-{}-0-0-{}", appName, streamName, timestamp, pullIdentKey);
        String md5FlvUrl = StrUtil.format("/{}/{}.flv-{}-0-0-{}", appName, streamName, timestamp, pullIdentKey);
        String md5M3u8Url = StrUtil.format("/{}/{}.m3u8-{}-0-0-{}", appName, streamName, timestamp, pullIdentKey);

        // md5加密
        String md5Str = DigestUtil.md5Hex(md5Url);
        String md5FlvStr = DigestUtil.md5Hex(md5FlvUrl);
        String md5M3u8Str = DigestUtil.md5Hex(md5M3u8Url);
        System.out.println("md5加密串,md5Url    =" + md5Url + "       ------     md5加密结果,md5Str = " + md5Str);
        System.out.println("md5加密串,md5FlvUrl =" + md5FlvUrl + "    ------    md5加密结果,md5FlvStr = " + md5FlvStr);
        System.out.println("md5加密串,md5M3u8Url=" + md5M3u8Url + "   ------    md5加密结果,md5M3u8Str = " + md5M3u8Str);

        // 组合三种拉流域名前缀
        // rtmp://{pullUrl}?auth_key={timestamp}-0-0-{md5Str}
        String rtmpUrl = StrUtil.format("rtmp://{}?auth_key={}-0-0-{}", pullUrl, timestamp, md5Str);
        // http://{pullUrl}.flv?auth_key={timestamp}-0-0-{md5FlvStr}
        String flvUrl = StrUtil.format("http://{}.flv?auth_key={}-0-0-{}", pullUrl, timestamp, md5FlvStr);
        // http://{pullUrl}.m3u8?auth_key={timestamp}-0-0-{md5M3u8Str}
        String m3u8Url = StrUtil.format("http://{}.m3u8?auth_key={}-0-0-{}", pullUrl, timestamp, md5M3u8Str);

        System.out.println("最终鉴权过的拉流rtmp域名  =" + rtmpUrl);
        System.out.println("最终鉴权过的拉流flv域名   =" + flvUrl);
        System.out.println("最终鉴权过的拉流m3u8域名  =" + m3u8Url);

        HashMap<String, String> urlMap = new HashMap<String, String>();
        urlMap.put("rtmpUrl", rtmpUrl);
        urlMap.put("flvUrl", flvUrl);
        urlMap.put("m3u8Url", m3u8Url);
        return urlMap;
    }

    public static void main(String[] args) {
        AliyunLiveUtil aliyunLiveUtil = new AliyunLiveUtil();
        aliyunLiveUtil.createPushUrl(identUrlValidTime, pushDomain, appName, streamName, pushIdentKey);
        aliyunLiveUtil.createPullUrl(pullDomain, appName, streamName, pullIdentKey, identUrlValidTime);
    }
}

运行结果

正确的执行结果类似如下:

推流域名前缀,rtmpUrl=rtmp://pushDomain/appName/streamName
md5加密串,md5Url=/appName/streamName-1574215092-0-0-pushIdentKey------md5加密结果,md5Str = 2a980bfb5aefb38858f2a3e65d351355
最终鉴权过的推流域名=rtmp://pushDomain/appName/streamName?auth_key=1574215092-0-0-2a980bfb5aefb38858f2a3e65d351355
组合通用域名,pullUrl=pullDomain/appName/streamName
md5加密串,md5Url    =/appName/streamName-1574215092-0-0-pullIdentKey       ------     md5加密结果,md5Str = fc4f0bf8419ed83b221033e67b8e6ba7
md5加密串,md5FlvUrl =/appName/streamName.flv-1574215092-0-0-pullIdentKey    ------    md5加密结果,md5FlvStr = 9e79d398d336f11e4bd9cceddb2271d6
md5加密串,md5M3u8Url=/appName/streamName.m3u8-1574215092-0-0-pullIdentKey   ------    md5加密结果,md5M3u8Str = b78d49c05d1a9deee5d4620db52a2ab8
最终鉴权过的拉流rtmp域名  =rtmp://pullDomain/appName/streamName?auth_key=1574215092-0-0-fc4f0bf8419ed83b221033e67b8e6ba7
最终鉴权过的拉流flv域名   =http://pullDomain/appName/streamName.flv?auth_key=1574215092-0-0-9e79d398d336f11e4bd9cceddb2271d6
最终鉴权过的拉流m3u8域名  =http://pullDomain/appName/streamName.m3u8?auth_key=1574215092-0-0-b78d49c05d1a9deee5d4620db52a2ab8