参考:
七牛云直播 产品主页
七牛云直播 开发文档
名词解释
直播空间: 类似直播间的分类
直播流: 类似直播间
直播域名: 直播以及观看直播,直播封面等url域名
直播推流:主播开启直播间
推流地址:主播开播连接的地址
直播拉流:观众获取直播间
播放地址:观众获取直播间的地址
快速入门
略
七牛云直播 开发文档有详细讲解
七牛云直播 开发文档 快速开始运行小程序流程
SDK
七牛云坑来了
七牛云直播 Java SDK
七牛云直播 小程序 demo
GetHub先下好 慢慢看md
然后直接看接口
七牛云直播 小程序 demo API
进入正题
添加七牛云依赖
<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;
}
@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
}