AWS: MediaPackageV2 构造库
本单元中更高层次的构件的API是实验性的并正在积极开发中. 在今后任何版本中,它们都须作非背向相容的修改或去除。 这些是 不适用 语义版本 模型和断开的更改 在发行笔记中宣布. 这意味着虽然你可能使用它们,但可能需要更新 当更新到此软件包的更新版本时,您的源代码.
AWS 元素介质包 V2
MediaPackage在不担心容量的情况下提供高品质的视频,并更方便地执行流行的DVR功能,如重新开始,暂停,倒放等. 您的内容将在DRM的全面支持下得到保护. 该服务与其他AWS媒体服务无缝地融合为一套完整的基于云的视频处理和发送工具.
此套件包含与 AWS Elemental MediaPackage V2 合作的构造. 允许您定义 AWS Elemental MediaPackage V2 频道组,频道,源端点,频道政策和源端点政策.
关于AWS元素介质包V2的进一步信息,参见: 文件。 。 。 .
以下示例创建了 AWS Elemental MediaPackage V2 频道组,频道和出处端点 :
declare const stack: Stack;
const group = new ChannelGroup(stack, 'MyChannelGroup', {
channelGroupName: 'my-test-channel-group',
});
const channel = new Channel(stack, 'MyChannel', {
channelGroup: group,
channelName: 'my-testchannel',
input: InputConfiguration.cmaf(),
});
const endpoint = new OriginEndpoint(stack, 'MyOriginEndpoint', {
channel,
originEndpointName: 'my-test-endpoint',
segment: Segment.cmaf(),
manifests: [Manifest.hls({
manifestName: 'index',
})],
});
使用工厂方法
declare const stack: Stack;
// Create a channel group
const group = new ChannelGroup(stack, 'MyChannelGroup', {
channelGroupName: 'my-channel-group',
});
// Add a channel using the factory method
const channel = group.addChannel('MyChannel', {
channelName: 'my-channel',
input: InputConfiguration.cmaf(),
});
// Add an origin endpoint using the factory method
const endpoint = channel.addOriginEndpoint('MyEndpoint', {
originEndpointName: 'my-endpoint',
segment: Segment.cmaf(),
manifests: [Manifest.hls({ manifestName: 'index' })],
});
频道组
一个频道组是顶级资源,由与之相关的频道和源端点组成.
以下代码创建了频道组 :
declare const stack: Stack;
const group = new ChannelGroup(stack, 'MyChannelGroup', {
channelGroupName: 'my-test-channel-group',
});
以下代码使用名称属性导入已存在的频道组 :
declare const stack: Stack;
const channelGroup = ChannelGroup.fromChannelGroupAttributes(stack, 'ImportedChannelGroup', {
channelGroupName: 'MyChannelGroup',
});
您也可以从自动提取名称和区域的 ARN 导入 :
declare const stack: Stack;
const channelGroup = ChannelGroup.fromChannelGroupArn(stack, 'ImportedChannelGroup',
'arn:aws:mediapackagev2:us-west-2:123456789012:channelGroup/MyChannelGroup',
);
对于跨区域的进口,通过 region 确保正确的ARN构建的参数:
declare const stack: Stack;
const channelGroup = ChannelGroup.fromChannelGroupAttributes(stack, 'ImportedChannelGroup', {
channelGroupName: 'MyChannelGroup',
region: 'us-west-2',
});
频道
一个频道是频道组的一部分,代表一个内容流进入MediaPackage的切入点.
输入配置
通道支持两种输入类型:HLS和CMAF.
declare const stack: Stack;
declare const group: ChannelGroup;
const hlsChannel = new Channel(stack, 'HlsChannel', {
channelGroup: group,
input: InputConfiguration.hls(),
});
const cmafChannel = new Channel(stack, 'CmafChannel', {
channelGroup: group,
input: InputConfiguration.cmaf({
inputSwitchConfiguration: {
mqcsInputSwitching: true,
},
outputHeaders: [HeadersCMSD.MQCS],
}),
});
const simpleCmafChannel = new Channel(stack, 'SimpleCmafChannel', {
channelGroup: group,
input: InputConfiguration.cmaf({
outputHeaders: [HeadersCMSD.MQCS],
}),
});
导入已有通道
以下代码使用名称属性导入一个已有信道:
declare const stack: Stack;
const channel = Channel.fromChannelAttributes(stack, 'ImportedChannel', {
channelName: 'MyChannel',
channelGroupName: 'MyChannelGroup',
});
您也可以从 ARN 导入 :
declare const stack: Stack;
const channel = Channel.fromChannelArn(stack, 'ImportedChannel',
'arn:aws:mediapackagev2:us-west-2:123456789012:channelGroup/MyGroup/channel/MyChannel',
);
导入的频道曝光 a region 属性,从 ARN 解析或返回导入堆栈的区域.
频道资源政策
以下代码直接在频道上创建资源策略. 这个 将自动创建第一个调用的政策 :
declare const channel: Channel;
channel.addToResourcePolicy(new PolicyStatement({
sid: 'AllowMediaLiveRoleToAccessEmpChannel',
principals: [new ArnPrincipal('arn:aws:iam::AccountID:role/MediaLiveAccessRole')],
effect: Effect.ALLOW,
actions: ['mediapackagev2:PutObject'],
resources: [channel.channelArn],
}));
来源终点
declare const stack: Stack;
declare const channel: Channel;
new OriginEndpoint(stack, 'myendpoint', {
channel,
originEndpointName: 'my-test-endpoint',
segment: Segment.cmaf(),
manifests: [
Manifest.hls({
manifestName: 'index',
}),
],
});
以下代码使用名称属性导入了已有的源端点 :
declare const stack: Stack;
const originEndpoint = OriginEndpoint.fromOriginEndpointAttributes(stack, 'ImportedOriginEndpoint', {
channelGroupName: 'MyChannelGroup',
channelName: 'MyChannel',
originEndpointName: 'MyExampleOriginEndpoint',
});
您也可以从 ARN 导入 :
declare const stack: Stack;
const originEndpoint = OriginEndpoint.fromOriginEndpointArn(stack, 'ImportedOriginEndpoint',
'arn:aws:mediapackagev2:us-west-2:123456789012:channelGroup/MyGroup/channel/MyChannel/originEndpoint/MyEndpoint',
);
以下代码创建了来源端点的资源政策. 这个 将自动创建第一个调用的政策 :
declare const origin: OriginEndpoint;
origin.addToResourcePolicy(new PolicyStatement({
sid: 'AllowRequestsFromCloudFront',
principals: [new ServicePrincipal('cloudfront.amazonaws.com')],
effect: Effect.ALLOW,
actions: ['mediapackagev2:GetHeadObject', 'mediapackagev2:GetObject'],
resources: [origin.originEndpointArn],
conditions: {
StringEquals: {
'aws:SourceArn': 'arn:aws:cloudfront::123456789012:distribution/AAAAAAAAA',
},
},
}));
CDN 授权
MediaPackage V2 支持两种方法将源端锁定到您的CDN:
- AWS 签名版本4(SigV4) ——CDN用IAM标志请求 角色。 。 。 亚马逊云龙,见 云纹融合。 。 。 . 见 SigV4 认证指南。 。 。 .
- 基于标题的 CDN 授权 - CDN在其中附带一个共同的秘密 mediaPackage 验证的请求头 。 当您的CDN 时使用此选项 并不支持SigV4(英语:SigV4). 见 CDN 授权指南。 。 。 .
要配置基于信头的授权, 设置 cdnAuth 编辑 OriginEndpoint
道具来. L2自动创建端点策略有:
- (单位:千美元)
PolicyStatement请求mediapackagev2:RequestHasMatchingCdnAuthHeader条件GetObject请求 - 页:1
CdnAuthConfiguration块中引用机密和读取的角色
如果你不提供角色,一个由需要的秘密管理器创建 和 KMS 权限.
import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager';
declare const channel: Channel;
declare const mySecret: secretsmanager.ISecret;
new OriginEndpoint(this, 'OriginEndpoint', {
channel,
segment: Segment.ts(),
manifests: [Manifest.hls({ manifestName: 'index' })],
cdnAuth: {
secrets: [mySecret],
},
});
你还可以打电话 addToResourcePolicy() 添加额外语句(例如a)
收割机允许使用);它们与自动创建的政策并列
相克语.
授予权限
给媒体提供方便
要允许 AWS 元素介质Live 将内容摄入媒体包频道,请使用 grants.ingest() 方法 :
declare const channel: Channel;
declare const mediaLiveRole: iam.IRole;
// Grant MediaLive permission to ingest content
channel.grants.ingest(mediaLiveRole);
云纹融合
MediaPackage起源端点被设计为与内容交付网络(CDN)如亚马逊CloudFront发行使用. CloudFront 为您提供缓存、 DDoS 保护以及全局内容发送服务 .
将 CloudFront 连接到 MediaPackage V2 端点的最简单方式是 MediaPackageV2Origin,它自动创建出源访问控制(OAC),并连接端点策略:
declare const endpoint: OriginEndpoint;
declare const group: ChannelGroup;
new cloudfront.Distribution(this, 'Distribution', {
defaultBehavior: {
origin: new MediaPackageV2Origin(endpoint, {
channelGroup: group,
}),
},
});
此操作处理 OAC 创建, HTTPS 唯一来源配置, 以及允许 CloudFront 访问端点( 包括 GetHeadObject 用于支持MQAR).
为了进行更多的控制,您可以手动配置策略和 OAC :
declare const originEndpoint: OriginEndpoint;
declare const distribution: cloudfront.Distribution;
originEndpoint.addToResourcePolicy(new iam.PolicyStatement({
sid: 'AllowCloudFrontServicePrincipal',
principals: [new iam.ServicePrincipal('cloudfront.amazonaws.com')],
effect: iam.Effect.ALLOW,
actions: ['mediapackagev2:GetObject', 'mediapackagev2:GetHeadObject'],
resources: [originEndpoint.originEndpointArn],
conditions: {
StringEquals: {
'aws:SourceArn': distribution.distributionArn,
},
},
}));
毕业计划:
MediaPackageV2Origin目前生活在这个α模块中. 当MediaPackage V2毕业生稳定后,它会转移到aws-cloudfront-origins并行S3BucketOrigin和其他出身的帮手.
显示配置
MediaPackage V2支持多种显示格式:HLS,Low-Latency HLS(LL-HLS),DASH,和微软平滑流(MSS).
HLS 声明
declare const channel: Channel;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf(),
manifests: [
Manifest.hls({
manifestName: 'index',
manifestWindow: Duration.seconds(60),
programDateTimeInterval: Duration.seconds(60),
scteAdMarkerHls: AdMarkerHls.DATERANGE,
}),
],
});
低密度 HLS 特性
declare const channel: Channel;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf(),
manifests: [
Manifest.lowLatencyHLS({
manifestName: 'index',
manifestWindow: Duration.seconds(30),
programDateTimeInterval: Duration.seconds(5),
childManifestName: 'child',
}),
],
});
DASH 宣言
declare const channel: Channel;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf(),
manifests: [
Manifest.dash({
manifestName: 'index',
manifestWindow: Duration.seconds(60),
minBufferTime: Duration.seconds(30),
minUpdatePeriod: Duration.seconds(10),
segmentTemplateFormat: SegmentTemplateFormat.NUMBER_WITH_TIMELINE,
periodTriggers: [
DashPeriodTriggers.AVAILS,
DashPeriodTriggers.DRM_KEY_ROTATION,
],
}),
],
});
MSS 宣言
declare const channel: Channel;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.ism(),
manifests: [
Manifest.mss({
manifestName: 'index',
manifestWindow: Duration.seconds(60),
manifestLayout: MssManifestLayout.COMPACT,
}),
],
});
多种表现形式
您可以为单个来源端点配置多个显示格式 :
declare const channel: Channel;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf(),
manifests: [
Manifest.hls({ manifestName: 'hls' }),
Manifest.dash({ manifestName: 'dash' }),
],
});
| 片段类型 | 支持的运单 |
|---|---|
| 分会.cmaf( ) | HLS, LL- HLS, DASH 软件 |
| 区段.t () | HLS, LL- 高级 |
| 部分. ism( ) | 医务科 |
每个发源端都有一个单段配置. 如果您需要不同配置的片段,请在同一频道上使用多源端点.
@ 见 https://docs.aws.amazon.com/mediapackage/latest/userguide/endpoints-create.html 页面存档备份,存于互联网档案馆
显示过滤
显式过滤器控制表内包含哪些变体. 过滤器类型安全,并对照 媒体包单过滤规则。 。 。 .
| 过滤器 | 方法 |
|---|---|
| 音频/ 视频比特率 | bitrate(), (中文(简体) ), bitrateRange(), (中文(简体) ), bitrateCombo() |
| 音频频道、样本率、视频高度、帧率、游戏高度 | numeric(), (中文(简体) ), numericList(), (中文(简体) ), numericRange(), (中文(简体) ), numericCombo() |
| 音频编码器 | audioCodec(), (中文(简体) ), audioCodecList() |
| 视频编码c | videoCodec(), (中文(简体) ), videoCodecList() |
| 视频动态范围 | videoDynamicRange(), (中文(简体) ), videoDynamicRangeList() |
| 剧本类型 | trickplayType(), (中文(简体) ), trickplayTypeList() |
| 音频/字幕语言 | text(), (中文(简体) ), textList() |
| 高级图案 | custom() |
以下例子创建了HD流式端点,仅服务于1至5 Mbps之间的H.264/H.265内容并有英语或法语的立体声
declare const channel: Channel;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf(),
manifests: [
Manifest.hls({
manifestName: 'index',
filterConfiguration: {
manifestFilter: [
ManifestFilter.bitrateRange(BitrateFilterKey.VIDEO_BITRATE, Bitrate.mbps(1), Bitrate.mbps(5)),
ManifestFilter.numericRange(NumericFilterKey.VIDEO_HEIGHT, 720, 1080),
ManifestFilter.videoCodecList([VideoCodec.H264, VideoCodec.H265]),
ManifestFilter.numeric(NumericFilterKey.AUDIO_CHANNELS, 2),
ManifestFilter.textList(TextFilterKey.AUDIO_LANGUAGE, ['en-US', 'fr']),
],
timeDelay: Duration.seconds(30),
},
}),
],
});
对于结合范围值和单一值的高级模式,使用 numericCombo() 或者说 bitrateCombo()数字 :
declare const channel: Channel;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf(),
manifests: [
Manifest.hls({
manifestName: 'index',
filterConfiguration: {
manifestFilter: [
// video_height:240-360,720-1080,1440
ManifestFilter.numericCombo(NumericFilterKey.VIDEO_HEIGHT, [
NumericExpression.range(240, 360),
NumericExpression.range(720, 1080),
NumericExpression.value(1440),
]),
],
},
}),
],
});
DRM 设置
您可以使用 HLS 和 LL- HLS 多变量播放列表排除会话密钥 drmSettings 过滤器配置 。 这改善了与遗留的 HLS 客户端的相容性,并提供了更多的颗粒式访问控制:
declare const channel: Channel;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf(),
manifests: [
Manifest.hls({
manifestName: 'index',
filterConfiguration: {
drmSettings: [DrmSettingsKey.EXCLUDE_SESSION_KEYS],
},
}),
],
});
开始标签配置
配置 HLS 和 LL- HLS 列表中使用 EXT- X- START 标记开始播放的地方 :
declare const channel: Channel;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf(),
manifests: [
Manifest.hls({
manifestName: 'index',
startTag: StartTag.of(10),
}),
],
});
部件配置
配置原端点的分区设置 .
declare const channel: Channel;
new OriginEndpoint(this, 'TsEndpoint', {
channel,
segment: Segment.ts({
duration: Duration.seconds(6),
name: 'segment',
includeDvbSubtitles: true,
useAudioRenditionGroup: true,
includeIframeOnlyStreams: false,
scteFilter: [
ScteMessageType.BREAK,
ScteMessageType.DISTRIBUTOR_ADVERTISEMENT,
],
}),
manifests: [Manifest.hls({ manifestName: 'index' })],
});
new OriginEndpoint(this, 'CmafEndpoint', {
channel,
segment: Segment.cmaf({
duration: Duration.seconds(6),
name: 'segment',
includeIframeOnlyStreams: true,
scteFilter: [ScteMessageType.DISTRIBUTOR_ADVERTISEMENT],
}),
manifests: [Manifest.hls({ manifestName: 'index' })],
});
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf(),
manifests: [Manifest.hls({ manifestName: 'index' })],
});
加密和DRM
使用 SPEKE( 安全包件和编码器密钥交换) 加密保护您的内容 。 每个容器类型都有自己的加密类,有类型安全选项:
CMAF 加密
declare const channel: Channel;
declare const spekeRole: iam.IRole;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf({
encryption: CmafEncryption.speke({
method: CmafEncryptionMethod.CBCS,
drmSystems: [CmafDrmSystem.FAIRPLAY, CmafDrmSystem.WIDEVINE],
resourceId: 'my-content-id',
url: 'https://example.com/speke',
role: spekeRole,
keyRotationInterval: Duration.seconds(300),
audioPreset: PresetSpeke20Audio.PRESET_AUDIO_2,
videoPreset: PresetSpeke20Video.PRESET_VIDEO_2,
}),
}),
manifests: [Manifest.hls({ manifestName: 'index' })],
});
TS 加密
declare const channel: Channel;
declare const spekeRole: iam.IRole;
new OriginEndpoint(this, 'TsEndpoint', {
channel,
segment: Segment.ts({
encryption: TsEncryption.speke({
method: TsEncryptionMethod.SAMPLE_AES,
resourceId: 'my-content-id',
url: 'https://example.com/speke',
role: spekeRole,
}),
}),
manifests: [Manifest.hls({ manifestName: 'index' })],
});
TS 加密默认基于方法的 DRM 系统: FairPlay for SAMPLE_AES,用于 AES_128。您可以用 drmSystems 使用属性 TsDrmSystem。 。 。 .
内容密钥加密
您可以通过提供导入到 AWS 证书管理器的证书来添加内容密钥加密 。 您的 DRM 密钥提供者必须支持内容密钥加密才能工作 :
declare const channel: Channel;
declare const spekeRole: iam.IRole;
declare const certificate: certificatemanager.ICertificate;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf({
encryption: CmafEncryption.speke({
method: CmafEncryptionMethod.CBCS,
drmSystems: [CmafDrmSystem.FAIRPLAY],
resourceId: 'my-content-id',
url: 'https://example.com/speke',
role: spekeRole,
certificate,
}),
}),
manifests: [Manifest.hls({ manifestName: 'index' })],
});
不包括部分 DRM 元数据
对于CMAF内容,您可以将 DRM 元数据从片段中排除:
declare const channel: Channel;
declare const spekeRole: iam.IRole;
new OriginEndpoint(this, 'Endpoint', {
channel,
segment: Segment.cmaf({
encryption: CmafEncryption.speke({
method: CmafEncryptionMethod.CBCS,
drmSystems: [CmafDrmSystem.FAIRPLAY],
resourceId: 'my-content-id',
url: 'https://example.com/speke',
role: spekeRole,
excludeSegmentDrmMetadata: true,
}),
}),
manifests: [Manifest.hls({ manifestName: 'index' })],
});
ISM( 流出) 加密
ISM端点使用带有PlayReady的CENC加密. 音频和视频预设总是 SHARED,则不支持密钥旋转。 DRM 系统默认为 PlayReady :
declare const channel: Channel;
declare const spekeRole: iam.IRole;
new OriginEndpoint(this, 'IsmEndpoint', {
channel,
segment: Segment.ism({
encryption: IsmEncryption.speke({
resourceId: 'my-content-id',
url: 'https://example.com/speke',
role: spekeRole,
}),
}),
manifests: [Manifest.mss({ manifestName: 'index' })],
});
云表计量
MediaPackage V2资源披露了用于监测的"云表"计量标准. 您可以使用这些参数创建提醒和仪表板:
declare const channelGroup: ChannelGroup;
declare const channel: Channel;
declare const endpoint: OriginEndpoint;
// Create a CloudWatch alarm on channel group egress bytes
const alarm = channelGroup.metricEgressBytes().createAlarm(this, 'HighEgress', {
threshold: 1000,
evaluationPeriods: 1,
});
// Monitor channel ingress response time
channel.metricIngressResponseTime().createAlarm(this, 'SlowIngress', {
threshold: 1000,
evaluationPeriods: 2,
});
// Track origin endpoint request count
const requestMetric = endpoint.metricEgressRequestCount({
statistic: 'sum',
period: Duration.minutes(5),
});
现有衡量标准包括:
metricIngressBytes()- 摄入的字节metricEgressBytes()- 已发送字节metricIngressResponseTime()- 入侵反应时间(平均)metricEgressResponseTime()- 侵略反应时间(平均)metricIngressRequestCount()- 入侵请求的数目metricEgressRequestCount()- 请求入侵的次数
所有衡量标准都支持用于自定义周期、统计和维度的标准 " 云表观察 " 计量选项.