欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

腾讯云直播-开启互动直播

程序员文章站 2022-07-06 20:28:12
...

项目背景:基于腾讯云直播开发项目,直播交友平台1+6模式

ps : 记录自己的日常 

一、申请腾讯视频权限(官方链接)

ps:  流程图

腾讯云直播-开启互动直播

首先在流管理添加一个域名 类型为播放域名域名地址为 推流域名的域名前缀+你的域名生成的而已域名或者三级域名

腾讯云直播-开启互动直播

然后点击你保存的播放域名查看详情

腾讯云直播-开启互动直播

然后去自己的购买的网站域名中心进行解析域名解析的域名为你保存的域名地址

类型为CNAME,填写的是在腾讯播放域名的详情里的CNAME

为了信息数据安全我在流管理的播放流加入了HTTS的证书

二、在云直播的直播sdk列表中找到License,申请测试license添加ios/安卓的包名和随机的appname

腾讯云直播-开启互动直播

然后拿着key 、lincenseURL交给ios和安卓开发人员

三、开通即时通讯IM 拿着 appskID 和秘钥 处理业务(注册)

 

package com.skyonez.core.util;

import java.io.IOException;

import org.apache.http.Consts;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

import com.skyonez.core.constant.Parameter;
import com.skyonez.core.entity.User;
import com.tencentyun.TLSSigAPIv2;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class TencentIMUtils {

	public static final long SDK_APP_ID =  你的sdkappid;

	public static final String KEY = "你的秘钥";

	/**
	 * 账号注册
	 * 
	 * @param user 用户对象
	 * @return 响应
	 */
	public static JSONObject create(User user) {
		// 请求地址
		String url = "https://console.tim.qq.com/v4/im_open_login_svc/account_import";
		// 封装请求参数
		JSONObject param = new JSONObject();
		param.put("Identifier", String.valueOf(user.getId()));
		param.put("Nick", user.getUsername());
		param.put("FaceUrl", Parameter.OSS_BUCKET + "/" + user.getHeadPortrait());
		param.put("Type", 0);
		return post(url, param);
	}

	/**
	 * 添加好友
	 * 
	 * @param user
	 * @return
	 */
	public static JSONObject addFriend(Integer id, Integer toId) {
		// 请求地址
		String url = "https://console.tim.qq.com/v4/sns/friend_add";
		// 封装请求参数
		JSONObject param = new JSONObject();
		param.put("From_Account", String.valueOf(id));
		JSONArray array = new JSONArray();
		JSONObject friend = new JSONObject();
		friend.put("To_Account", String.valueOf(toId));
		friend.put("AddSource", "AddSource_Type_Android");
		array.add(friend);
		param.put("AddFriendItem", array);
		param.put("AddType", "Add_Type_Single");
		param.put("ForceAddFlags", 1);
		return post(url, param);
	}

	/**
	 * 删除好友
	 * 
	 * @param user
	 * @return
	 */
	public static JSONObject deleteFriend(Integer id, Integer toId) {
		// 请求地址
		String url = "https://console.tim.qq.com/v4/sns/friend_delete";
		// 封装请求参数
		JSONObject param = new JSONObject();
		param.put("From_Account", String.valueOf(id));
		JSONArray array = new JSONArray();
		array.add(String.valueOf(toId));
		param.put("To_Account", array);
		param.put("DeleteType", "Delete_Type_Both");
		return post(url, param);
	}

	/**
	 * 通过用户id获取sig
	 * 
	 * @param id 用户id
	 * @return sig
	 */
	public static String genSig(Integer id) {
		TLSSigAPIv2 api = new TLSSigAPIv2(SDK_APP_ID, KEY);
		return api.genSig(String.valueOf(id), 180 * 86400).replaceAll("(\\r\\n|\\n|\\n\\r)", "");
	}

	/**
	 * 通用请求
	 * 
	 * @param url   请求地址
	 * @param param 参数
	 * @return 响应
	 */
	private static JSONObject post(String url, JSONObject param) {
		// 验证获取签名
		TLSSigAPIv2 api = new TLSSigAPIv2(SDK_APP_ID, KEY);
		// 获取签名
		String usersig = api.genSig("admin", 1800).replaceAll("(\\r\\n|\\n|\\n\\r)", "");
		// 获取DefaultHttpClient请求
		HttpClient client = HttpClientBuilder.create().build();
		HttpPost httpPost = new HttpPost(url + "?sdkappid=" + SDK_APP_ID + "&identifier=admin&usersig=" + usersig
				+ "&random=" + StringUtils.randomUUID() + "&contenttype=json");
		// 设置请求的header
		httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
		// 设置请求的参数
		StringEntity params = (new StringEntity(param.toString(), Consts.UTF_8));
		// 将参数传入httpBody中
		httpPost.setEntity(params);
		// 执行请求
		HttpResponse response;
		try {
			response = client.execute(httpPost);
			return JSONObject.fromObject(EntityUtils.toString(response.getEntity(), "utf-8"));
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 拉黑好友
	 * 
	 * @param user
	 * @return
	 */
	public static JSONObject addBlack(Integer id, Integer toId) {
		// 请求地址
		String url = "https://console.tim.qq.com/v4/sns/black_list_add";
		// 封装请求参数
		JSONObject param = new JSONObject();
		param.put("From_Account", String.valueOf(id));
		JSONArray array = new JSONArray();
		array.add( String.valueOf(toId) );
		param.put("To_Account", array);
		
		return post(url, param);
	}

	/**
	 * 取消拉黑好友
	 * 
	 * @param user
	 * @return
	 */
	public static JSONObject deleteBlack(Integer id, Integer toId) {
		// 请求地址
		String url = "https://console.tim.qq.com/v4/sns/black_list_delete";
		// 封装请求参数
		JSONObject param = new JSONObject();
		param.put("From_Account", String.valueOf(id));
		JSONArray array = new JSONArray();
		array.add( String.valueOf(toId) );
		param.put("To_Account", array);
		return post(url, param);
	}

}

 

四、生成推拉流地址

package com.skyonez.core.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 腾讯推流、拉流工具
 * 
 * @author aaa@qq.com
 */
public class TecentCloudUtils {


    // 这就是个日志,不需要的删掉就行了
    private static final Logger logger = LoggerFactory.getLogger(TecentCloudUtils.class);

    // 用于 生成推流防盗链的key
    public static final String key = "推拉流放到key" ;

 
    public static final String bizid = "你的推流地址上前缀*****.livepush.myqcloud.com 的*****";

    public static final String APPID = "点击你的头像查看你的信息里的APPid";
 
    // 用于主动查询和被动通知的key:API鉴定key
    public static final String API_KEY = "api鉴权key";

    // API回调地址
    public static final String API_ADDRESS = "http://fcgi.video.qcloud.com/common_access";

    /**
     * 推流地址
     */
    public static final String PUSH_URL = "rtmp://" + bizid + ".livepush.myqcloud.com/live/";

    /**
     * PC拉流地址
     */
//    public static final String PULL_RTMP_URL = "rtmp://" + bizid + ".名/live/"+ bizid + "_";
    public static final String PULL_RTMP_URL = "rtmp://" + bizid + ".域名/live/";
//    public static final String PULL_RTMP_URL = "rtmp://" + bizid + ".域名/live/";
    /**
     * app拉流地址
     */
    //  https://59744.liveplay.myqcloud.com/live/1003634281.flv
    public static final String PULL_URL = "https://"+ bizid +".play.unclexin.com/live/";
//    public static final String PULL_URL = "https://"+ bizid +".liveplay.myqcloud.com/live/";
  

    /**
     * 这是推流防盗链的生成 KEY+ streamId + txTime
     * 
     * @param key
     *            防盗链使用的key
     * @param streamId
     *            通常为直播码.示例:bizid+房间id
     * @param txTime
     *            到期时间
     * @return
     * @author aaa@qq.com
     */
    public static String getSafeUrl(String key, String streamId, long txTime) {
        String input = new StringBuilder().
                append(key).
                append(streamId).
                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 final char[] DIGITS_LOWER =
            {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};


    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);
    }

    /**
     * 推流地址生成
     */
    public static String getPushUrl(String roomId,Long txTime) {

        String safeUrl = getSafeUrl(key, roomId, txTime);

        String realPushUrl = PUSH_URL + roomId + "?"+ safeUrl;

        return realPushUrl;
    }

    /**
     * APP拉流地址获得
     */
    public static String getPullUrl(String owenrId,Long txTime) {
        String safeUrl = getSafeUrl(key, owenrId, txTime);
//        String appPullUrl = PULL_URL + owenrId + ".flv"+ "?"+ safeUrl;
        String appPullUrl = PULL_URL + owenrId + ".flv"+ "?"+ safeUrl+"&bizid"+bizid ;
//        String appPullUrl = PULL_URL + owenrId + ".flv";
        return appPullUrl;
    }

    /**
     * PC拉流地址获得
     */
    public static String getPullRtmpUrl(String owenrId,Long txTime) {
        String safeUrl = getSafeUrl(key, owenrId, txTime);
//        String pullRtmpUrl = PULL_RTMP_URL + owenrId;
//       String pullRtmpUrl = PULL_RTMP_URL + owenrId+ "?"+ safeUrl ;
       String pullRtmpUrl = PULL_RTMP_URL + owenrId+ "?"+ safeUrl+"&bizid"+bizid ;
        return pullRtmpUrl;
    }
    /**
     * APP拉流地址获得
     */
    public static String getHlsPullUrl(String owenrId,Long txTime) {
        String safeUrl = getSafeUrl(key, owenrId, txTime);
//        String appPullUrl = PULL_URL + owenrId + ".flv"+ "?"+ safeUrl;
        String appPullUrl = PULL_URL + owenrId + ".m3u8"+ "?"+ safeUrl+"&bizid"+bizid ;
//        String appPullUrl = PULL_URL + owenrId + ".flv";
        return appPullUrl;
    }
 
    
//
//    /**
//     * 获取关闭直播的url关闭直播 需要发送请求给腾讯服务器,然后返回结果
//     *
//     * @param id
//     *            需要关闭的房间ID
//     * @return 关闭直播的url
//     * @author aaa@qq.com
//     * @date 2017年7月22日 下午2:54:14
//     */
//    public static String getCloseLiveUrl(String id) {
//        // 此请求的有效时间
//        Long current = System.currentTimeMillis() / 1000 + 10;
//        // 生成sign签名
//        String sign = MD5Encode.stringToMD5(new StringBuffer().append(API_KEY).append(current).toString());
//        // 生成需要关闭的直播码
//        String code = bizid + "_" + id;
//        // 生成关闭的参数列表
//        String params = new StringBuffer().append("&interface=Live_Channel_SetStatus").append("&Param.s.channel_id=").append(code).append("&Param.n.status=0").append("&t=").append(current).append("&sign=").append(sign).toString();
//
//        // 拼接关闭URL
//        String url = API_ADDRESS + "?appid=" + APPID + params;
//        return url;
//    }
//
 
 
    public static void main(String[] args) {
//    	https://59744.liveplay.myqcloud.com/live/1003634281.flv
//    	https://59744.liveplay.myqcloud.com/live/1003634281.fl
        // 腾讯云获取推流地址、拉流地址
        Long now = System.currentTimeMillis() + 60L * 60L * 24L * 30L * 1000L;// 要转成long类型,不然为负数
        // 当前毫秒数+需要加上的时间毫秒数 = 过期时间毫秒数
        Long txTime = now / 1000;// 推流码过期时间秒数
        String pushUrl = TecentCloudUtils.getPushUrl("1003634281",txTime);
        String pullUrl = TecentCloudUtils.getPullUrl("1003634281",txTime);
        String pullRtmpUrl = TecentCloudUtils.getPullRtmpUrl("1003634281",txTime);
        System.out.println(pushUrl);
        System.out.println(pullUrl);
        System.out.println(pullRtmpUrl);
	}
    
    /**
     * 这是推流防盗链的生成 KEY+ streamId + txTime
     * 
     * @param key
     *            防盗链使用的key
     * @param streamId
     *            通常为直播码.示例:bizid+房间id
     * @param txTime
     *            到期时间
     * @return
     * @author aaa@qq.com
     */
    public static String md5( long txTime) {
        String input = new StringBuilder().
                append(key).
                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 ? "" :txSecret.toString() ;
    }
    
    
}

待续