java实现腾讯云直播

云直播官方文档:https://cloud.tencent.com/document/product/267
云直播在线生成api:https://console.cloud.tencent.com/api/explorer?Product=live&Version=2018-08-01&Action=UpdateLiveWatermark&SignVersion=

对云直播api调用的主要目的是用来对直播进行一些操作,大部分操作需要购买,后面有部分对接,这些其实都是官方能够生成的:
在这里插入图片描述
需要在域名管理处生成推流域名和播放域名:https://console.cloud.tencent.com/live/domainmanage

我这用的rtmp推流(可用腾讯视频云小程序->点击RTMP推流,进行测试),flv文件播放(flv在线播放:https://imgcache.qq.com/open/qcloud/video/player/demo/player.html)
封装的帮助类:

@Data
@Component
public class TencentLiveInfo {
    // 推流域名
    @Value("${live.push.pushDomain}")
    private String pushDomain;
    // 播放域名
    @Value("${live.play.playDomain}")
    private String playDomain;
    // 应用名称
    @Value("${live.push.appName}")
    private String appName;
    // key 推流域名那能看到
    @Value("${live.push.masterKey}")
    private String masterKey;
    // 访问腾讯api的secretId
    @Value("${live.secretId}")
    private String secretId;
    // 访问腾讯api的secretKey
   @Value("${live.secretKey}")
    private String secretKey;
    // 腾讯api访问域名
    @Value("${live.url}")
    private String url;
}

生成推流地址(可生成多种推流方式,具体见官方文档):

/**
     * 获取视频推送流地址
     * @param streamName 流名称
     * @param txTime 过期时间
     * @return
     */
    public static String getPushUrl(String streamName, long txTime) {
        String input = new StringBuilder().
                append(tencentLiveInfo.getMasterKey()).
                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();
        }

        //视频推送url
        String pushUrl = new StringBuilder().
                append("rtmp://").
                append(tencentLiveInfo.getPushDomain()).
                append("/").
                append(tencentLiveInfo.getAppName()).
                append("/").
                append(streamName).
                append("?txSecret=").
                append(txSecret).
                append("&txTime=").
                append(Long.toHexString(txTime).toUpperCase()).toString();

        return pushUrl;
    }
    
    /**
     * 转码-byte转hexString
     * @param data
     * @return
     */
    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);
    }

生成播放路径(可生成多种播放方式,具体见官方文档):

/**
     * 获取播放地址
     * @param streamName 流名称
     * @param txTime 过期时间
     * @return
     */
    public static String getPlayUrl(String streamName,long txTime){
        String playUrl = new StringBuilder().
                append("http://").
                append(tencentLiveInfo.getPlayDomain()).
                append("/").
                append(tencentLiveInfo.getAppName()).
                append("/").
                append(streamName).
                append(".flv").toString();

        return playUrl;
    }

tips:两处的流名称必须一致

我这接了部分api:

    /**
     * 初始化腾讯文档api调用配置
     * @return
     */
    private static LiveClient initTencent(){
        Credential cred = new Credential(tencentLiveInfo.getSecretId(), tencentLiveInfo.getSecretKey());

        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setEndpoint(tencentLiveInfo.getUrl());

        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);

        LiveClient client = new LiveClient(cred, "", clientProfile);
        return client;
    }
    
    /**
     * 停止推流-暂停直播
     * @return
     */
    public static String stopPush(String streamName){
        try{
            LiveClient client = initTencent();

            DropLiveStreamRequest req = new DropLiveStreamRequest();
            req.setStreamName(streamName);
            req.setDomainName(tencentLiveInfo.getPushDomain());
            req.setAppName(tencentLiveInfo.getAppName());
            DropLiveStreamResponse resp = client.DropLiveStream(req);

            return DropLiveStreamResponse.toJsonString(resp);
        } catch (TencentCloudSDKException e) {
            return e.toString();
        }
    }

    /**
     * 开始推流-重新直播
     * @param streamName
     * @return
     */
    public static String startPush(String streamName){
        try{
            LiveClient client = initTencent();

            ResumeLiveStreamRequest req = new ResumeLiveStreamRequest();
            req.setAppName(tencentLiveInfo.getAppName());
            req.setDomainName(tencentLiveInfo.getPushDomain());
            req.setStreamName(streamName);
            ResumeLiveStreamResponse resp = client.ResumeLiveStream(req);

            return ResumeLiveStreamResponse.toJsonString(resp);
        } catch (TencentCloudSDKException e) {
            System.out.println(e.getMessage());
            return e.toString();
        }
    }

其他都差不多,都有生成的

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值