赞
踩
参考:
七牛云直播 产品主页
七牛云直播 开发文档
名词解释
直播空间: 类似直播间的分类
直播流: 类似直播间
直播域名: 直播以及观看直播,直播封面等url域名
直播推流:主播开启直播间
推流地址:主播开播连接的地址
直播拉流:观众获取直播间
播放地址:观众获取直播间的地址
快速入门
略
七牛云直播 开发文档有详细讲解
七牛云直播 开发文档 快速开始运行小程序流程
SDK
七牛云坑来了
七牛云直播 Java SDK
七牛云直播 小程序 demo
GetHub先下好 慢慢看md
然后直接看接口
七牛云直播 小程序 demo API
进入正题
添加七牛云依赖
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<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; }
@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 }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。