Java对接腾讯云直播示例

时间:2024-03-11 16:43:26

首先是官网的文档地址 云直播 新手指南

在这里插入图片描述

可以发现它这个主要是按流量和功能收费的 价格总览
流量这里还只收下行的费用,就是只收观看消耗的流量费
其它的收费就是一些增值业务费 (包括直播转码、直播录制、直播截图、直播审核、智能鉴黄、实时监播、移动直播连麦、直播时移、拉流转推、延时播放),这些不用就不收费

在这里插入图片描述

好了我们来看下怎么用
首先我们需要申请一个账号,有账号的直接登录没有的注册一个

在这里插入图片描述

登录成功后进控制台

在这里插入图片描述

直接搜云直播

在这里插入图片描述

选域名管理,注意这里需要两个域名,一般申请两个二级域名就可以了,比如拉流域名pull.test.com和推流域名push.test.com,大家自己申请,也可以申请试用域名(找客服帮你弄就可以了)
推流地址就是指录制视频的地址
拉流地址就是观看视频的地址

在这里插入图片描述

注意有任何不懂的看右下角有个客服头标,顾客是上帝,他们基本能解决你使用上的所有问题

在这里插入图片描述

域名配置好后点后面的管理

在这里插入图片描述
我这是拉流地址的配置,主要就是访问控制这一块,就是配置你视频观看地址安全的,你可以根据需要选择配置,这块都是免费的放心配没关系,特别是第一项Key鉴权,就是俗称的防盗链,为了防止有人恶意使用地址建议配置选上,记录下面那个key,后面会用到

在这里插入图片描述

这里也可以直接生成播放地址的

在这里插入图片描述

然后是推流地址配置,一样的我们把鉴权配置开启,也是为了防止有人盗用地址等问题

在这里插入图片描述
这里也可以直接生成推流地址的

在这里插入图片描述

注意:只要StreamName一样那么推流和拉流就是同一个视频,如果推流的时候两个流都往一个StreamName上推只会显示第一个流的视频

我们先测试一下刚才生成的地址,大家刚才没有保存没关系,重新生成一个就好了,地址生成没有使用不收费,因为没有产生流量
注意我们尽量用webrtc流,据文档写的这个速度快支持更大的并发

我们去常用工具测试推流地址(就是用刚才上面生成的推流地址放到3所示位置),点开始推流

在这里插入图片描述

我们再把刚才的拉流地址放到下面这个页面里点播放 (注意拉流地址的StreamName要和推流地址一样) 视频播放器

在这里插入图片描述

可以看到画面就说明刚才生成的推流地址和拉流地址可用
当然这是在控制台操作,我们需要把这个功能对接到系统里面才行,不过也很简单,就是简单的字符串拼接
直接上代码

import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Slf4j
@Log4j2
public class TencentYunLiveUtil {


    //========================推流配置
    /**
     * 推流防盗链的key 控制台获取
     */
    public static final String PUSH_KEY = "111111111111111111111111111111111";

    /**
     * 推流地址 控制台配置
     */
    public static final String PUSH_URL = "webrtc://push.test.co";


    //========================拉流配置
    /**
     * 拉流防盗链的key 控制台获取
     */
    public static final String PLAY_KEY = "1111111111111111111111";

    /**
     * 拉流地址 控制台配置
     * 可将rtmp切换为webrtc,这个更快支持高并发
     */
    public static final String PLAY_URL = "webrtc://pull.test.co";

    /**
     * APP名称 自定义的,默认为live
    */
    public static final String APP_NAME = "123";


    public static String getPushUrl(String streamName, Date time) {
        StringBuffer urlSB = new StringBuffer();
        urlSB.append(PUSH_URL);
        urlSB.append("/");
        urlSB.append(APP_NAME);
        urlSB.append("/");
        urlSB.append(streamName);
        urlSB.append("?");
        urlSB.append("txSecret=");
        urlSB.append(MD5Util.getMD5Str(PUSH_KEY + streamName + to16Hex(time)));
        urlSB.append("&");
        urlSB.append("txTime=");
        urlSB.append(to16Hex(time));

        return urlSB.toString();
    }

    public static String getPlayUrl(String streamName, Date time) {
        StringBuffer urlSB = new StringBuffer();
        urlSB.append(PLAY_URL);
        urlSB.append("/");
        urlSB.append(APP_NAME);
        urlSB.append("/");
        urlSB.append(streamName);
        urlSB.append("?");
        urlSB.append("txSecret=");
        urlSB.append(MD5Util.getMD5Str(PLAY_KEY + streamName + to16Hex(time)));
        urlSB.append("&");
        urlSB.append("txTime=");
        urlSB.append(to16Hex(time));

        return urlSB.toString();
    }

    /**
     * 将传入的时间转换为 16进制
     *
     * @param date
     * @return
     */
    public static String to16Hex(Date date) {
        Long aLong = date.getTime() / 1000;
        String hexString = Long.toHexString(aLong);
        return hexString.toUpperCase();
    }

    public static void main(String[] args) {
        // 将字符串日期转换成date
        String str = "2024-03-09 12:00:00";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        String pushUrl = null;
        try {
            pushUrl = getPushUrl("456", sdf.parse(str));
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        System.out.println(pushUrl);
        String playUrl = null;
        try {
            playUrl = getPlayUrl("456", sdf.parse(str));
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        System.out.println(playUrl);
    }

}

运行一下
可以看到我们在生成的地址中加了个日期,这个日期就是当前这个链接的有效期,过了这个时间那么这个链接就会失效,但是要注意的是如果推流不结束是不会中断的

在这里插入图片描述