七牛云直播小程序java后台接口调试

七牛云直播 接口测试

参考:
七牛云直播 产品主页
七牛云直播 开发文档

  1. 名词解释
    直播空间: 类似直播间的分类
    直播流: 类似直播间
    直播域名: 直播以及观看直播,直播封面等url域名
    直播推流:主播开启直播间
    推流地址:主播开播连接的地址
    直播拉流:观众获取直播间
    播放地址:观众获取直播间的地址

  2. 快速入门

    七牛云直播 开发文档有详细讲解
    七牛云直播 开发文档 快速开始运行小程序流程

  3. SDK
    七牛云坑来了
    七牛云直播 Java SDK
    七牛云直播 小程序 demo
    GetHub先下好 慢慢看md
    然后直接看接口
    七牛云直播 小程序 demo API

  4. 进入正题
    添加七牛云依赖

<dependency>
	<groupId>com.qiniugroupId>
	<artifactId>qiniu-java-sdkartifactId>
	<version>[7.2.0, 7.2.99]version>
dependency>

上工具类

/**
 * 七牛云直播配置&工具
 * Created by yxf(qq:2395073039)
 * on 2020/3/20.
 */
    public final static String QiNiuHost ="kldyxf.com";//域名
    public final static String QiNiuVERSION = "2.1.0";//版本
    public final static String QiNiuUserAgent = String.format("pili-sdk-java/%s %s %s/%s", QiNiuVERSION, System.getProperty("java.version"), System.getProperty("os.name"), System.getProperty("os.arch"));//忘记了,好像没有用
    public final static String QiNiuAccessKey ="XXX";//AK
    public final static String QiNiuSecretKey  ="XXX";//SK
    public final static String QiNiuDomainSnapshot = "pili-snapshot.mokesv.com";//直播封面加速域名
    public final static String QiNiuDomainVod = "pili-vod.mokesv.com";//直播转存MP4等点播文件的点播域名
    public final static String QiNiuDomainPublish = "pili-publish.mokesv.com";//RTMP直播推流域名
    public final static String QiNiuDomainRtmp = "pili-live-rtmp.mokesv.com";//RTMP直播播放域名-直播观看
    public final static String QiNiuDomainHls = "pili-live-hls.mokesv.com";//HTTP HLS直播播放域名-直播观看
    public final static String QiNiuDomainHdl = "pili-live-hdl.mokesv.com";//HTTP FLV直播播放域名-直播观看
    public final static String QiNiuSpace1  ="moke-zhibo";//直播云中的空间名称
    public final static Auth QiNiuAuth = Auth.create(QiNiuAccessKey, QiNiuSecretKey);//Auth对象
	
	 /**
     * 推流
     * 直播地址生成的UrlFactory对象
     * @param hubName 直播流名
     * @param date 直播时间 秒
     * @return
     */
    public static String urlPublish(String hubName, int date){
        UrlFactory uf = new UrlFactory( QiNiuSpace1,QiNiuAuth,
                QiNiuDomainPublish, QiNiuDomainRtmp, QiNiuDomainHls,
                QiNiuDomainHdl, QiNiuDomainSnapshot);
        if (date<0){
            date = 3600;
        }
        String url = uf.rtmpPublishUrl(hubName, date);//生成带有效期鉴权的RTMP推流地址
//        url = uf.rtmpPlayUrl(hubName);
//        url = uf.hlsPlayUrl(hubName);
//        url = uf.hdlPlayUrl(hubName);
//        url = uf.snapshotUrl(hubName);
        return url;
    }

    /**
     * 拉流
     * @param hubName 直播流名
     * @return
     */
    public static String urlPlay(String hubName){
        UrlFactory uf = new UrlFactory(QiNiuSpace1,QiNiuAuth,
                QiNiuDomainPublish, QiNiuDomainRtmp, QiNiuDomainHls,
                QiNiuDomainHdl, QiNiuDomainSnapshot);
        String url = uf.rtmpPlayUrl(hubName);
        return url;
    }
    /**
     * 直播封面
     * @param hubName 直播流名
     * @return
     */
    public static String urlSnapshot(String hubName){
        UrlFactory uf = new UrlFactory( QiNiuSpace1,QiNiuAuth,
                QiNiuDomainPublish, QiNiuDomainRtmp, QiNiuDomainHls,
                QiNiuDomainHdl, QiNiuDomainSnapshot);

        String url = uf.snapshotUrl(hubName);
//        url = uf.hlsPlayUrl(hubName);
//        url = uf.hdlPlayUrl(hubName);
//        url = uf.snapshotUrl(hubName);
        return url;
    }
    /**
     * 创建直播流
     * @param stream 直播流名称(确保直播流重复)
     */
    public static boolean CreateRoom(String stream){
        try {
            manager.create(stream);
            StreamAttribute attr = manager.attribute(stream);//获取流对象的相关信息
            if (attr!=null){
                System.out.println("创建成功 创建时间:"+attr.createdAt+" 修改时间:"+attr.updatedAt+" 启用时间:"+attr.expireAt+"禁用时间:"+attr.disabledTill);
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
//            System.out.println("创建直播流失败");
        }
        return false;
    }
    /**
     * 获取直播流的相关信息
     * @param stream 直播流名称(确保直播流存在)
     * @return
     */
    public static StreamAttribute GetRoom(String stream){
        try {
            StreamAttribute attr = manager.attribute(stream);//获取流对象的相关信息
            if (attr!=null){
                System.out.println("创建成功 创建时间:"+attr.createdAt+" 修改时间:"+attr.updatedAt+" 启用时间:"+attr.expireAt+"禁用时间:"+attr.disabledTill);
                return attr;
            }
        } catch (Exception e) {
            e.printStackTrace();
//            System.out.println("创建直播流失败");
        }
        return null;
    }
    /**
     * 禁用直播流
     * @param stream 直播流名称(确保直播流存在)
     * @return
     */
    public static boolean disableRoom(String stream){
        try {
            manager.disableTill(stream, -1);
            StreamAttribute attr = manager.attribute(stream);
            if (attr.disabledTill==(-1)){
                System.out.println("禁用成功 创建时间:"+attr.createdAt+" 修改时间:"+attr.updatedAt+" 启用时间:"+attr.expireAt+"禁用时间:"+attr.disabledTill);
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 禁用直播流
     * @param stream 直播流名称(确保直播流存在)
     * @param Date 禁用时间单位天
     * @return
     */
    public static boolean disableRoom(String stream, int Date){
        // 获取当前时间并计算出禁用时间
        long t = System.currentTimeMillis() / 1000 + Date*24*60*60;
        try {
            manager.disableTill(stream, t);
            StreamAttribute attr = manager.attribute(stream);
            System.out.println("禁用成功 创建时间:"+attr.createdAt+" 修改时间:"+attr.updatedAt+" 启用时间:"+attr.expireAt+"禁用时间:"+attr.disabledTill);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 启用直播流
     * @param stream 直播流名称(确保直播流存在)
     * @return
     */
    public static boolean enableRoom(String stream){
        try {
            manager.enable(stream);
            StreamAttribute attr = manager.attribute(stream);
            System.out.println("创建成功 创建时间:"+attr.createdAt+" 修改时间:"+attr.updatedAt+" 启用时间:"+attr.expireAt+"禁用时间:"+attr.disabledTill);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 查看直播流状态
     * @param stream 直播流名称(确保直播流存在)
     * @return
     */
    public static StreamStatus statusRoom(String stream){
        try {
            StreamStatus status = manager.status(stream);
            return status;
        } catch (Exception e) {
//            e.printStackTrace();
        }
        return null;
    }
    /**
     * 录制点播
     * 该方法录制的时间段为整个流开始和结束时间
     * @param stream 直播流名称(确保直播流存在)
     * @param fileName 录制后保存的文件名
     * @return
     */
    public boolean saveAsRoom(String stream,String fileName){
        try {
            manager.saveAs(stream, fileName, 0, 0);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 录制点播
     * 获取流推流的片段列表,一个流开始和断流算一个片段
     * @param start 开始时间戳,单位秒
     * @param end 结束时间戳,单位秒
     * @return
     */
    public boolean historyRoom(String stream, long start, long end){
        try {
            ActivityRecords records = manager.history(stream, start, end);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 获取直播流列表
     * @param live   是否直播中
     * @param prefix 流名称前缀
     * @param marker 第一次执行的时候,不用传入marker,表示从起始位置开始列举;上一次执行list如果中断了,会返回一个marker,表示从这个标记位置开始继续list;
     * @return
     */
    public static String[] listRoom(boolean live, String prefix, String marker){
        try {
            if (Strings.isNullOrEmpty(marker)){
                StreamListing l = manager.listStreams(live, prefix, null);
                String[] keys = l.keys();
                return keys;
            }else {
                StreamListing l = manager.listStreams(live, prefix, marker);
                String[] keys = l.keys();
                return keys;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 根据前缀获取流列表的迭代器
     * @param live   是否直播中
     * @param prefix 流名称前缀
     * @return
     */
    public String[] listteratorRoom(boolean live, String prefix){
        try {
            StreamingManager.ListIterator it = manager.createStreamListIterator(live, prefix);
            String[] keys = it.next();
            return keys;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
  1. 对接口
    · 获取用户登录信息(略 查看)
    · 更新用户信息(略 查看)
    · 解密微信的加密数据(略 查看)
    · 将用户加入内部的群组表(略 没写)
    · 获取正在推流的用户
    @RequestMapping("/activeuser")
    public ResPonObject activeuser(HttpSession session, HttpServletRequest request,
                                   @RequestParam(value="groupId",required=false,defaultValue="") String  groupId){
        System.out.println(request.getHeader("Authorization"));
        System.out.println("==========获取正在推流的用户\n groupId:"+groupId);
        String[] list = QiNiu.listRoom(false, "test", null);
        List<ActiveUser> activeUserList = new ArrayList<>();
        for(String s: list){
            ActiveUser activeUser = new ActiveUser();
//            activeUser.setAvatarUrl("http://pili-snapshot.mokesv.com/"+s+"/"+s+".jpg");
            activeUser.setAvatarUrl("http://img4.imgtn.bdimg.com/it/u=3347054600,86785670&fm=26&gp=0.jpg");
            activeUser.setLiveTitle(s+"直播间");
            activeUser.setNickName(s+"主播");
            activeUser.setUserId(s);
            activeUserList.add(activeUser);
        }
        ResPonObject resPonObject = new ResPonObject();
        resPonObject.setData(activeUserList);
        return resPonObject;
    }

· 获取RTMP的推流或者播放地址

    /**
     * 获取推流地址 (直播)
     * @param session
     * @param request
     * @return
     */
    @RequestMapping("/publish")
    public ResPonObject publish(HttpSession session, HttpServletRequest request){
        System.out.println("获取推流地址:"+request.getHeader("Authorization"));
        String urlRtmp = QiNiu.urlPublish("test-003",5*60);
        System.out.println("推流地址:"+urlRtmp);
        Map<String,String> param = new HashMap<>();
        param.put("url",urlRtmp);
        param.get("url");
        ResPonObject resPonObject = new ResPonObject();
        resPonObject.setData(param);
        return resPonObject;
    }

    /**
     * 获取拉流地址 (看直播)
     * @param request authToken
     * @param userId 直播流名
     * @return
     */
    @RequestMapping("/play")
    public ResPonObject play(HttpSession session, HttpServletRequest request,
                             @RequestParam(value="userId",required=false,defaultValue="") String  userId){
        System.out.println("获取拉流地址:"+request.getHeader("Authorization"));
        String urlRtmp = QiNiu.urlPlay(userId);
        System.out.println("拉流地址:"+urlRtmp);
        Map<String,String> param = new HashMap<>();
        param.put("url",urlRtmp);
        ResPonObject resPonObject = new ResPonObject();
        resPonObject.setData(param);
        return resPonObject;
    }

返回数据对象封装

/**
 * 返回数据对象封装
 * Created by daishunfu(qq:893858134)
 * on 2018/4/9.
 */
@Data
public class ResPonObject implements Serializable{
    //请求处理状态 SUCCESS,ERROR...
    private ResponStatus status = ResponStatus.SUCCESS;
    //cookie
    private String token = "";
    //失败/错误消息,成功没有
    private String msg = "";
    //数据
    private Object data;
    //下行
    private int m = 0;
    //响应错误码
    private int code;
}
/**
 * 返回状态常量
 * Created by daishunfu(qq:893858134)
 * on 2018/4/4.
 */
public enum ResponStatus {
    //成功
    SUCCESS,
    //错误
    ERROR,
    //余额不足
    NOT_MONEY,
    //积分不足
    NOT_INTEGRAL,
    //未登录
    NOT_LOGIN,
    //不允许重复登录
    NOT_LOGIN_NOT,
    //未找到
    NOT_FIND,
    //异常
    EXCEPTION,
    //余额不足
    NOT_BALANCE,
    //无权限
    NOT_AUTHOR,
    //支付密码错误
    NOT_PASSWORD_ERROR,
    //socket未注册
    SOCKET_NO_REGISTER
}

你可能感兴趣的:(笔记)