阿里云视频直播开发----java

1:开通阿里云直播服务

2:进入到直播控制台

3:点击域名管理----添加推流域名

同样方式添加播流域名,根据需要选择加速区域

4:返回列表

注意CNAME和直播中心

复制CNAME参数跳转到域名控制台,域名列表中选择对应域名,然后点击解析,再点击添加记录

返回列表启用该域名,同样的方式配置播流,注意直播中心要选择同一个中心

5:返回直播控制台--》域名管理---》配置域名

配置播流和推流关联,播流和推流域名配置中有访问控制,开启url鉴权,会看到主KEY,播流和推流主KEY开发中用得到

然后点击直播管理中的地址生成

appName和StreamName自定义即可,StreamName就算是房间id吧,个人理解,然后点击开始生成

然后得到推流和播流地址

下载阿里推荐的obs推流工具和vlc播放工具

添加一个场景 、添加一个来源选择显示器采集或者媒体源,点击控件中的设置选择推流

确定之后点击开始推流

然后复制播流地址打开VLC点击媒体----》打开网络串流,输入播流地址,我在测试的时候除了RTMP格式的除外其他的都不能播放,

代码直接复制阿里云调试中的

@ApiOperation("直播鉴权")
@PostMapping("/authentication")
public CommonResult authentication(String roomId) {
    String pullDomain = videoClientConfig.getPullDomain();
    String pushDomain = videoClientConfig.getPushDomain();
    String appName = videoClientConfig.getAppName();
    String pullIdentKey = videoClientConfig.getPullIdentKey();
    String pushIdentKey = videoClientConfig.getPushIdentKey();
    Integer identUrlValidTime = videoClientConfig.getIdentUrlValidTime();
    String pushUrl = AliyunLiveUtil.createPushUrl(identUrlValidTime, pushDomain, appName, roomId, pushIdentKey);
    Map<String, String> map = AliyunLiveUtil.createPullUrl(pullDomain, appName, roomId, pullIdentKey, identUrlValidTime);
    map.put("pushUrl",pushUrl);
    log.info("-------------拉流域名={}", JSONObject.toJSONString(map));
    return CommonResult.success(map);
}

参数roomId是StreamName

 /**
     * 根据源id创建该id的推流url
     *
     * @param identUrlValidTime 鉴权url的有效时间(秒),默认30分钟,1800秒
     * @param pushDomain        推流域名
     * @param appName           直播测试appName
     * @param streamName        直播测试streamName
     * @param pushIdentKey      推流鉴权url key
     * @return
     */ 
public static 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);
        log.info("----------推流域名前缀,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);
        log.info("---------md5加密串,md5Url={}------md5加密结果,md5Str = {}",md5Url,md5Str);

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

        return finallyPushUrl;
    }
/**
     * 创建拉流域名,key=rtmpUrl、flvUrl、m3u8Url,代表三种拉流类型域名
     *
     * @param pullDomain        拉流域名
     * @param appName           应用名称
     * @param streamName        流名称
     * @param pullIdentKey      拉流鉴权url key
     * @param identUrlValidTime 鉴权url的有效时间(秒),默认30分钟,1800秒
     * @return
     */
    public static 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);
        log.info("-----createPullUrl-------组合通用域名,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);
        log.info("-------createPullUrl----------md5加密串,md5Url    ={},------       md5加密结果,md5Str = {}",md5Url, md5Str);
        log.info("-------createPullUrl----------md5加密串,md5FlvUrl ={},------    md5加密结果,md5FlvStr = {}",md5FlvUrl,md5FlvStr);
        log.info("-------createPullUrl----------md5加密串,md5M3u8Url={},------    md5加密结果,md5M3u8Str= {}",md5M3u8Url,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);

        log.info("-------createPullUrl----最终鉴权过的拉流rtmp域名  ={}",rtmpUrl);
        log.info("-------createPullUrl----最终鉴权过的拉流flv域名   ={}",flvUrl);
        log.info("-------createPullUrl----最终鉴权过的拉流m3u8域名  ={}",m3u8Url);

        HashMap<String, String> urlMap = new HashMap<String, String>();
        urlMap.put("rtmpUrl", rtmpUrl);
        urlMap.put("flvUrl", flvUrl);
        urlMap.put("m3u8Url", m3u8Url);
        return urlMap;
    }
@Getter
@Setter
public class VideoClientConfig {

//    private static String liveEdge = "www.yourLiveEdge.club";
//    private static String liveVideo = "www.yourLiveVideo.club";

    /**
     * 推流域名
     */
    @Value("${aliyun.pushDomain}")
    private String pushDomain;
    /**
     * 播流域名
     */
    @Value("${aliyun.pullDomain}")
    private String pullDomain;
    @Value("${aliyun.regionId-bj}")
    private String regionIdbj;
    @Value("${aliyun.regionId-sh}")
    private String regionIdsh;
    @Value("${aliyun.accessKeyID}")
    private String accessKeyID;
    @Value("${aliyun.accessKeySecret}")
    private String accessKeySecret;
    @Value("${aliyun.appName}")
    private String appName;
    @Value("${aliyun.pullIdentKey}")
    private String pullIdentKey;
    @Value("${aliyun.pushIdentKey}")
    private String pushIdentKey;
    @Value("${aliyun.streamName}")
    private String streamName;
    @Value("${aliyun.identUrlValidTime}")
    private Integer identUrlValidTime;
    @Value("${aliyun.liveDomainType}")
    private String liveDomainType;

    /**
     * Initialization  初始化公共请求参数
     */
    public DefaultAcsClient initialization() {
        // 初始化请求参数,可用地区码,key,secret
        DefaultProfile profile = DefaultProfile.getProfile(regionIdbj, accessKeyID, accessKeySecret);
        DefaultAcsClient defaultAcsClient = new DefaultAcsClient(profile);
        return defaultAcsClient;
    }

然后在控制器中:

@Autowired
private VideoClientConfig videoClientConfig;

参数配置

aliyun:
  pullIdentKey: 123456
  pushIdentKey: 789012
  appName: test
  identUrlValidTime: 1800
  regionId: cn-beijing
  # 推流域名
  pushDomain: push.test.com
  # 域名业务类型。取值:liveVideo:播流域名  liveEdge:边缘推流域名
  liveDomainType: liveVideo
  # 播流域名
  pullDomain: pull.test.com
  # 推流回调地址
  pushNotify: http://test.test.com/live/notify/push
  accessKeyID: 123456789
  accessKeySecret: 987654321

 pullIdentKey: 123456
  pushIdentKey: 789012

这两个参数分别是直播控制台的域名管理中的播流域名和推流域名中的主KEY,如果不一致的话不影响鉴权,但是最后输出的播流和推流地址在工具中不能使用,要么不能正常播放。

其他代码就可以从阿里云调试中copy了

猜你喜欢

转载自blog.csdn.net/wdz985721191/article/details/115011791