java接入亚马逊直播aws-ivs(Amazon Interactive Video Service)直播
·
我们的场景是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);
,还有一些场景需要进行对流推流和断流进行监听的没放上面来,懒得写了,有需要的留言,我看到了再放上来。
更多推荐



所有评论(0)