一、背景
最近公司用到推拉流,经过一番比较后决定使用腾讯云。但是腾讯云的文档确实有点一言难尽,去网上搜索一下例子,结果就是把腾讯云的demo粘贴过去,还必须得是会员才能看,坑啊!!所以老周也把自己做的小demo贴出来,帮助感兴趣的童鞋更快的了解腾讯云直播。不多说上干货
二、代码实现
public static void main(String[] args) {
//时间戳有效期默认到未来的24小时
long nows = (System.currentTimeMillis() + 86400000) /1000;
System.out.println(nows);
//获得鉴权key
String apiKey = "ef7b9ea9ef7b9ea9ef7b9ea9ef7b9ea9"; // 这个是推流网址中生成的apikey
String txrtmp = getSafeUrl(apiKey , "test", nows);
System.out.println(txrtmp);
//生成推流地址
String pushUrl = "push.tencent.com"; // 推流的网址,需要在腾讯云直播进行配置
initPush(pushUrl, "live", "test", txrtmp);
//生成播流地址
String pullUrl = "pull.tencent.com"; // 播流的网址,需要在腾讯云直播进行配置
initPull(pullUrl, "live", "test");
}
/**
* 生成推流地址
* @param domain 推流地址
* @param AppName 应用名称 默认为live
* @param StreamName 流标识 同一推流地址中的唯一标识
* @param key 鉴权key
*/
public static void initPush(String domain, String AppName, String StreamName, String key){
//获取推流地址
System.out.println("===================获取推流地址====================");
String obsPush = "rtmp://"+domain+"/"+AppName+"/";
System.out.println("obs推流地址:"+obsPush);
String obsPushName = StreamName+"?"+key;
System.out.println("obs推流名称:"+obsPushName);
String rtmpPush = obsPush + obsPushName;
System.out.println("推流地址:"+rtmpPush);
}
/**
* 生成播流地址
* @param domain 播流地址
* @param AppName 应用名称 默认为live
* @param StreamName 流标识 同一播流地址中的唯一标识
*/
public static void initPull(String domain, String AppName, String StreamName){
//获取播流地址
System.out.println("====================获取播流地址===================");
//rtmp协议播流地址
String rtmpPull = "rtmp://"+domain+"/"+AppName+"/"+StreamName;
System.out.println(rtmpPull);
String hlsPull = "http://"+domain+"/"+AppName+"/"+StreamName+".m3u8";
System.out.println(hlsPull);
String flvPull = "http://"+domain+"/"+AppName+"/"+StreamName+".flv";
System.out.println(flvPull);
}
/**
*下面是腾讯云直播自己的demo,老周研究发现主要用户生成鉴权key
*/
private static final char[] DIGITS_LOWER =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
/*
* KEY+ streamName + txTime
*/
private static String getSafeUrl(String key, String streamName, long txTime) {
String input = new StringBuilder().
append(key).
append(streamName).
append(Long.toHexString(txTime).toUpperCase()).toString();
String txSecret = null;
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
txSecret = byteArrayToHexString(
messageDigest.digest(input.getBytes("UTF-8")));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return txSecret == null ? "" :
new StringBuilder().
append("txSecret=").
append(txSecret).
append("&").
append("txTime=").
append(Long.toHexString(txTime).toUpperCase()).
toString();
}
private static String byteArrayToHexString(byte[] data) {
char[] out = new char[data.length << 1];
for (int i = 0, j = 0; i < data.length; i++) {
out[j++] = DIGITS_LOWER[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS_LOWER[0x0F & data[i]];
}
return new String(out);
}