简单介绍
这里的直播功能依赖的是腾讯云的云直播接口,我们只负责编写的配置类中自己的参数即可实现,甚至不需要导入额外的依赖。
配置类
/**
* @Author zrq
* @Date 2020/6/15 18:15
*/
@Slf4j
public class TencentYunVedioUtil {
//推流防盗链的key 你自己的推流K
public static final String push_key = "********************";
//拉流防盗链的key 你自己的直播K,注意域名需要去解析CNAME,推流k和拉流k可能相同
public static final String play_key = "********************";
//推流地址
public static final String pushUrl ="rtmp://******.push.tlivecloud.com/****/";
//拉流地址 例子 rtmp 只需要将push 改成play即可
//自己申请的播放地址域名xx.xxx.cn或xx.xxx.com
public static final String playUrl_rtmp ="rtmp://********************/***/";
public static final String playUrl_flv ="https://********************/****/";
public static final String playUrl_hls ="http://********************/*****/*********.m3u8";
/**
* 生成防盗链签名
* @param key :防盗链key
* @param streamName :直播码(或称作流ID)
* @param txTime :过期时间 16进制的unix时间戳
* @return
*/
public static String genSign(String key,String streamName, String txTime) {
return MD5Encode.getMD5Str(key+streamName+txTime);
}
/**
* 播放
* @param key
* @param txTime
* @return
*/
public static String pushSign(String key,String streamName, String txTime) {
return MD5Encode.getMD5Str(key+streamName+txTime);
}
/**
* 生成直播码
* 直播码 也叫房间号,推荐用随机数字或者用户ID,注意一个合法的直播码需要拼接 BIZID 前缀。
* @param bizid
* @param userId 用户id
* @return
*/
public static String genLiveCode(String bizid,String userId) {
return bizid+"_"+userId;
}
/**
* 随机生成6位数字
*/
public static String bizid(){
int newNum = (int)((Math.random()*9+1)*100000000);
return String.valueOf(newNum);
}
/**
* 将传入的时间转换为 16进制
* @param date
* @return
*/
public static String to16Hex(Date date) {
Long ab = date.getTime()/1000;
String a = Long.toHexString(ab);
return a.toUpperCase();
}
/**
* 将当前时间加1天
*/
public static Date addOneDay() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 1);
Date date = cal.getTime();
return date;
}
/**
* 校验是否在线
* @param urls 拉流地址
* @return
*/
public static boolean isPush(String urls) {
try {
URL url = new URL(urls);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(1000);
conn.setReadTimeout(1000);
conn.setRequestMethod("GET");
conn.connect();
return conn.getResponseCode() == 200;
} catch (Exception e) {
}
return false;
}
}
我们需要改的就是最上面的参数,这些参数也都是腾讯云生成的,只需要自己简单配置下就可以使用。
开启腾讯云直播功能后,腾讯云会分配给我们一个推流的域名,这个是可以在本地自己使用的,但是要上线一个项目的时候,还是建议使用有https协议的域名,只有这样直播的视频流才能被推上去,当时因为这个问题困扰了好久,当然自己在本地测试是不会有这个问题的。
然后就可以开启鉴权,设置过期时间,建议过期时间设置的长一些,至少要大于一场直播的时间,不然可能会出现推流地址过期的问题。
填入streamName后就可以生成一些推流的配置信息。
找到自己需要的直接cv即可。
然后就是拉流了,需要自己的一个域名。
这里因为我这个域名用来搭建博客了,所以就是x状态,正常情况下应该是下面的一样的。
之后的操作跟推流类似,同样过期时间也尽量设置的长一些。
最后,我们就可以写自己的逻辑接口了。
/**
* @author zrq
* @ClassName LiveController
* @date 2023/1/27 16:40
* @Description TODO
*/
@RestController
@RequestMapping("/live/")
@Slf4j
public class LiveController {
@Autowired
private UserService userService;
/**
* 生成推流全路径地址
* * @param pushUrl 推流地址 头部
* * @param stream_id 直播码 调用该方法genLiveCode() 生成
* * @param push_key 推流鉴权
* * @return
*
*/
@PostMapping("createPushUrl")
@AccessLimit(seconds = 100, maxCount = 1)
public JsonResult createPushUrl() {
//过期时间 16进制的unix时间戳
String txTime = to16Hex(addOneDay());
// 填写自己的streamName
String bizid = bizid();
String streamName=bizid;
StringBuffer sb = new StringBuffer();
String pushUrlHead= TencentYunVedioUtil.pushUrl;
sb.append(pushUrlHead+streamName).append("?")
.append(genSign(push_key,streamName,txTime)).append("&").append("txTime=")
.append(txTime);
Map<String,String> map = new HashMap<>();
map.put("address",sb.toString());
map.put("bizid",streamName);
return JsonResult.ok(map);
}
/**
* * 生成拉流全路径地址
* * @param playUrlHead 拉流的头地址
* * @param stream_id 直播码 调用该方法genLiveCode() 生成
* * @param play_key 拉流鉴权
* * @param end 如 .flv结尾
* * @return
*/
@PostMapping("createPlayUrl")
@ApiOperation("播放地址")
public String createPlayUrl(String bizid) {
//过期时间 16进制的unix时间戳
String txTime = to16Hex(addOneDay());
StringBuffer sb = new StringBuffer();
String streamName=bizid;
//String stream_id = TencentYunVedioUtil.bizid();
sb.append(playUrl_flv+streamName+".flv").append("?").append(pushSign(play_key,streamName, txTime))
.append("&")
.append("txTime=")
.append(txTime);
return sb.toString();
}
@PostMapping("sendMessage")
@ApiOperation("发送弹幕")
public JsonResult sendMessage(String bizid,String message) {
return userService.sendMessage(bizid, message);
}
}
这边建议不要想我一样直接写在Controller层,我只是来测试的,真正的代码逻辑还是要写在ServiceImpl层中。
最后最后,我们可以利用腾讯云自带的功能来测试自己生成的地址到底能不能用
只有这一个出现问题,那就没问题。