我们的场景是java生成推流和播放地址,前端获取我们后端地址进行接入。

废话不多说,直接开干。

接入前准备:

1.AWS开通Amazon Interactive Video Service服务。

2.AWS开通IAM应用创建用户,需要给ivs的权限,同时把keyId和密钥复制好

点击用户进去给权限,图中的两个。

pom依赖。

只需要这个就行了,maven中央仓库也能找到

<!-- https://mvnrepository.com/artifact/software.amazon.awssdk/ivs 直播需要的-->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>ivs</artifactId>
<version>2.29.35</version>
</dependency>

下面开始写代码。

获取推流地址和播放地址,在AWS-ivs中统一称为通道,只要创建了通道,里面就会有相关的信息,

package xxx.aws;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.ivs.IvsAsyncClient;

/**
 * 亚马逊直播client配置
 */
@Configuration
public class AwsClientConfig {

    @Value("${aws.accessKeyId}")
    private String accessKeyId;

    @Value("${aws.secretAccessKey}")
    private String secretAccessKey;

    @Value("${aws.region}")// 选择区域
    private String region;

    @Bean
    public IvsAsyncClient ivsClient() {
        return IvsAsyncClient.builder()
                .region(Region.of(region))
                .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKeyId, secretAccessKey)))
                .build();
    }
}

创建通道

package xxx.utils;


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import software.amazon.awssdk.services.ivs.IvsAsyncClient;
import software.amazon.awssdk.services.ivs.model.*;

import javax.validation.constraints.NotNull;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

@Slf4j
@Component
public class AwsUtils {

    @Autowired
    private AwsClientConfig awsClientConfig;

    /**
     * 创建通道-创建推流地址同时获取创建的推流以及播放的信息
     * @param channelName 通道名称可重复,最好不要重复
     * @return AwsChannelVO
     */
    public AwsChannelVO createChannel(@NotNull final String channelName){
        AwsChannelVO channelVO = new AwsChannelVO();
        IvsAsyncClient ivsClient = awsClientConfig.ivsClient();
        // 配置创建通道的请求
        CreateChannelRequest createChannelRequest = CreateChannelRequest.builder()
                .name(channelName) // 自定义通道名称
                .latencyMode(ChannelLatencyMode.LOW) // 设置低延迟模式
                .type(ChannelType.STANDARD) // STANDARD 或 BASIC 类型
                .authorized(false) // 设置是否需要授权访问
                .build();

        // 异步请求创建通道
        CompletableFuture<CreateChannelResponse> futureResponse = ivsClient.createChannel(createChannelRequest);

        // 处理异步响应
        futureResponse.whenComplete((result, exception) -> {
            if (exception != null) {
                log.error("创建通道失败: {}", exception.getMessage());
                return;
            }

            Channel channel = result.channel();
            StreamKey streamKey = result.streamKey();
            log.info("创建通道成功,直播等信息为:{}", channel.toString());
            log.info("创建通道成功,streamKey信息为:{}", streamKey.toString());
            /**
             * 获取rtmps服务器地址-
             * 摄取服务器确定接收流的特定 Amazon IVS 组件,以及摄取协议(例如 RTMPS)。
             * 摄取服务器 URL 由协议(RTMPS)
             * rtmps://、
             * ingestEndpoint
             * 端口
             * :443
             * 和尾随路径名称组成。
             * /app/
              */
            channelVO.setName(channel.name());
            if(null != channel.type())
                channelVO.setType(channel.type().name());
            if(null != channel.latencyMode())
                channelVO.setLatencyMode(channel.latencyMode().name());
            channelVO.setIngestEndpoint(channel.ingestEndpoint());
            channelVO.setArn(channel.arn());
            channelVO.setStreamKeyArn(streamKey.arn());
            channelVO.setStreamKeyValue(streamKey.value());
            channelVO.setRtmps("rtmps://"+channel.ingestEndpoint()+":443/app/");
            if(null != channel.srt()){
                channelVO.setSrt("srt://" + channel.srt().endpoint()+":9000?streamid="+streamKey.value()+"&passphrase="+channel.srt().passphrase());
                channelVO.setSrtPassPhrase(channel.srt().passphrase());
            }
            channelVO.setPlaybackUrl(channel.playbackUrl());
        });
        // 等待请求完成,设置超时
        try {
            futureResponse.get(30, TimeUnit.SECONDS); // 设置30秒超时
        } catch (Exception e) {
            log.error("创建通道超时或失败", e);
        }
        log.info("channelVO最后的数据为:{}", channelVO.toString());
        return channelVO;
    }
}

vo类我也贴一下吧,就是接收亚马逊返回的字段定义等

package xxx.vo;

import lombok.Data;
import java.io.Serializable;

@Data
public class AwsChannelVO implements Serializable {

    /**
     * 名称
     */
    private String name;
    /**
     * 类型
     */
    private String type;
    /**
     * 通道模式
     */
    private String latencyMode;

    /**
     * 摄取端点 ingestEndpoint 在配置 Web 广播 SDK 时使用
     */
    private String ingestEndpoint;

    /**
     * arn通道的唯一标识资源的字符串 后续用作和系统用户绑定
     */
    private String arn;

    /**
     * streamKey ARN 是标识流密钥(Stream Key)的唯一资源名称 这里一般不用
     */
    private String streamKeyArn;

    /**
     * 流密钥 一般为sk_开头
     */
    private String streamKeyValue;
    /**
     * 获取rtmps服务器地址-
     * 摄取服务器确定接收流的特定 Amazon IVS 组件,以及摄取协议(例如 RTMPS)。
     * 摄取服务器 URL 由协议(RTMPS)
     * rtmps://、
     * ingestEndpoint
     * 端口
     * :443
     * 和尾随路径名称组成。
     * /app/
     */
    private String rtmps;
    /**
     * srt地址
     * SRT 摄取服务器 URL 由摄取协议(SRT)
     * srt://
     * SRT 端点
     * e0ddac59affc.srt.live-video.net
     * 端口
     * :9000
     * 流 ID(即流密钥值
     * 和用于加密内容的 SRT 密码)组成。仅在未启用不安全摄取时才使用此选项。
     */
    private String srt;
    /**
     * srt密码短语
     */
    private String srtPassPhrase;

    /**
     * 播放地址
     */
    private String playbackUrl;

    @Override
    public String toString() {
        return "AwsChannelVO{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", latencyMode='" + latencyMode + '\'' +
                ", ingestEndpoint='" + ingestEndpoint + '\'' +
                ", arn='" + arn + '\'' +
                ", streamKeyArn='" + streamKeyArn + '\'' +
                ", streamKeyValue='" + streamKeyValue + '\'' +
                ", rtmps='" + rtmps + '\'' +
                ", srt='" + srt + '\'' +
                ", srtPassPhrase='" + srtPassPhrase + '\'' +
                ", playbackUrl='" + playbackUrl + '\'' +
                '}';
    }
}

最后在你的service类直接调用即可

 @Autowired
 private AwsUtils awsUtils;


 AwsChannelVO channel = awsUtils.createChannel(name);

,还有一些场景需要进行对流推流和断流进行监听的没放上面来,懒得写了,有需要的留言,我看到了再放上来。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐