一、申请腾讯云账号,用自己的微信即可,第一次申请会送腾讯云直播20G的流量,用来测试足够了
此截图为腾讯云后台截图
二、创建Springboot工程,无需引入其他jar包
三、
1.分析腾讯云要求生成推流,拉流(直播)规则
推流域名(domain):自己的账号rtmp://+id+livepush.myqcloud.com
例如我id为123456,那么我的推流域名(domain)rtmp://123456.livepush.myqcloud.com
注意:中间有个 “.”
AppName:默认live就行
StreamName:这个推流和拉流要一直,随便填写就行,要保持一致
例如:我填写Abc
鉴权key:在自己腾讯云账号里面查看
具体查看方法:域名管理→点击腾讯云分配的推流域名→
这个API Key就是鉴权K
2.拉流,也就是直播地址
这个必须先申请一个可用有效的域名,然后进行CNAME解析
前期准备工作就这么多,废话不多说,直接上代码
四、
1.创建MD5Encode工具类
package com.tencentyun.util;
import java.security.MessageDigest;
/**
* @Author zhushaojie
* @Date 2020/6/15 18:19
*/
public class MD5Encode {
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
public static String getMD5Str(String str) {
String resStr = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
resStr = byteArrayToHexString(md.digest(str.getBytes()));
} catch (Exception ex) {
ex.printStackTrace();
}
return resStr;
}
/**
* 转换字节数组为16进制字串
*
* @param b
* 字节数组
* @return 16进制字串
*/
private static String byteArrayToHexString(byte[] b) {
StringBuffer resSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resSb.append(byteToHexString(b[i]));
}
return resSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) n = 256 + n;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
}
2.创建TencentYunVedioUtil工具类
package com.tencentyun.util;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;
/**
* @Author zhushaojie
* @Date 2020/6/15 18:15
*/
public class TencentYunVedioUtil {
//推流防盗链的key 你自己的推流K
public static final String push_key = "XXXXXXXXXXXXXXXX";
//拉流防盗链的key 你自己的直播K,注意域名需要去解析CNAME,推流k和拉流k可能相同
public static final String play_key = "XXXXXXXXXXXXXXXX";
//推流地址
public static final String pushUrl ="rtmp://xxxxx.livepush.myqcloud.com/live/xxxxx";
//拉流地址 例子 rtmp 只需要将push 改成play即可
//自己申请的播放地址域名xx.xxx.cn或xx.xxx.com
public static final String playUrl_rtmp ="rtmp://xx.xxx.cn/live/xxxxx";
public static final String playUrl_flv ="http://xx.xxx.cn/live/xxxxx.flv";
public static final String playUrl_hls ="http://xx.xxx.cn/live/xxxxx.m3u8";
/**
* 生成防盗链签名
* @param key :防盗链key
* @param stream_id :直播码(或称作流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 txTime) {
return MD5Encode.getMD5Str(key+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)*100000);
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;
}
}
3.本次写测试方法用接口的方式,也可以用main方法,这个看个人爱好
创建TestController类
package com.tencentyun.util;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static com.tencentyun.util.TencentYunVedioUtil.*;
/**
* @Author zhushaojie
* @Date 2020/6/15 18:24
*/
@RestController
@RequestMapping("/")
public class TestController {
/**
* 生成推流全路径地址
* * @param pushUrl 推流地址 头部
* * @param stream_id 直播码 调用该方法genLiveCode() 生成
* * @param push_key 推流鉴权
* * @return
*
*/
@PostMapping("createPushUrl")
public static String createPushUrl() {
//过期时间 16进制的unix时间戳
String txTime = to16Hex(addOneDay());
// 填写自己的streamName
String streamName="xxxxx";
StringBuffer sb = new StringBuffer();
String pushUrlHead=TencentYunVedioUtil.pushUrl;
// String stream_id = TencentYunVedioUtil.bizid();
sb.append(pushUrlHead).append("?").append("txSecret=")
.append(genSign(push_key, streamName,txTime)).append("&").append("txTime=")
.append(txTime);
return sb.toString();
}
/**
* * 生成拉流全路径地址
* * @param playUrlHead 拉流的头地址
* * @param stream_id 直播码 调用该方法genLiveCode() 生成
* * @param play_key 拉流鉴权
* * @param end 如 .flv结尾
* * @return
*/
@PostMapping("createPlayUrl")
public static String createPlayUrl() {
//过期时间 16进制的unix时间戳
String txTime = to16Hex(addOneDay());
StringBuffer sb = new StringBuffer();
//String stream_id = TencentYunVedioUtil.bizid();
sb.append(playUrl_flv).append("?").append("txSecret=").append(pushSign(play_key, txTime))
.append("&")
.append("txTime=")
.append(txTime);
return sb.toString();
}
}
五、测试
个人喜欢用postman测试,也可以使用其他测试方法,浏览器测试也是可以的,注意是POST请求
推流测试地址:localhost:8080/createPushUrl
直播测试地址:localhost:8080/createPlayUrl
生成的推流地址和直播地址我们可以利用腾讯云提供的工具来测试是否可用
到这里就结束了,如果有小伙伴有疑问可以在下方留言,或者关注微信公众号咨询问题!