通过以下方式节省成本并获得更多功能 AWS Elemental MediaConvert
MediaConvert 是一项较新的基于文件的视频转码服务,它提供了一套全面的高级转码功能,按需费率起价为每分钟 0.0075 美元。阅读更多
已经在使用 Amazon Elastic Transcoder? 迁移到很简单 MediaConvert。有关更多信息,请参阅本概述
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
处理 Elastic Transcoder 中的错误
当您通过 Elastic Transcoder API 发送请求和获取响应时,可能会遇到两种 API 错误:
-
客户端错误:客户端错误由 4xx 形式的 HTTP 响应代码表示。客户端错误表明 Elastic Transcoder 发现客户端请求存在问题,例如身份验证失败或缺少必需参数。请修复客户端应用程序中存在的问题后再重新提交请求。
-
服务器错误:服务器错误由 5xx 形式的 HTTP 响应代码表示,这种错误需要由 Amazon 解决。您可以重新提交/重试请求,直到操作成功。
对于每个 API 错误,Elastic Transcoder 将返回以下值:
-
状态代码(例如,
400
) -
错误代码(例如,
ValidationException
) -
错误消息(例如,
Supplied AttributeValue is empty, must contain exactly one of the supported datatypes
)
有关 Elastic Transcoder 针对客户端错误和服务器错误返回的错误代码的列表,请参阅 API 错误代码(客户端错误和服务器错误)。
此外,Elastic Transcoder 处理您的任务时可能会遇到错误。有关更多信息,请参见 处理任务过程中出现错误。
API 错误代码(客户端错误和服务器错误)
HTTP 状态代码可以指明某一操作是否成功。
如果响应代码为 200
,则表明操作成功。其他错误代码表示客户端错误 (4xx) 或服务器错误 (5xx)。
下表列出了 Elastic Transcoder 返回的错误。某些错误只需重试同一请求即可解决。此表中会指出哪些错误只需连续重试就有可能解决。如果“重试”列的值为:
-
是:再次提交同一请求。
-
否:修复客户端的问题,然后再提交新请求。
有关重试请求的更多信息,请参阅 错误重试和指数回退。
HTTP 状态代码 | 错误代码 | 消息 | 原因 | 重试 |
---|---|---|---|---|
400 | 条件检查失败异常 | 有条件请求失败。 | 示例:预期值与系统中存储的值不匹配。 | 否 |
400 | 签名不完整异常 | 请求签名不符合 AWS 标准。 | 请求中的签名未包含所有必需的组件。请参阅 HTTP 标头内容。 | 否 |
403 | 缺少身份验证令牌异常 | 请求必须包含有效(已注册)的 AWS 访问密钥 ID。 | 请求未包含所需的 x-amz-security-token 。请参阅 向 Elastic Transcoder 发出 HTTP 请求。 |
否 |
400 | 验证异常 | 多种。 | 请求中的一个或多个值缺失或无效;例如,值为空或大于最大有效值。 | 否 |
403 | 访问被拒绝异常 |
|
您尝试删除系统预设,Elastic Transcoder API 调用中的签名无效,或用户的凭证未获得执行该操作的授权。 |
否 |
404 | 找不到资源异常 |
|
示例:您尝试为其添加任务的管道不存在或仍在创建中。 | 否 |
409 | 资源使用中异常 |
|
示例:您尝试删除当前正在使用中的管道。 | 否 |
429 | 超出限制异常 |
|
当前 AWS 账户已超出 Elastic Transcoder 对象的限制。有关更多信息,请参见 Elastic Transcoder 管道、任务和预设的数量限制。 | |
429 | 超出预配置吞吐量异常 | 超出预配置吞吐量上限。 |
示例:您的请求速率过高。Elastic Transcoder 的 AWS 开发工具包会自动对收到此异常的请求进行重试。除非您的重试队列太长以致无法完成,您的请求最终都会成功。请降低请求频率。有关更多信息,请参见 错误重试和指数回退。 如果您通过轮询来确定请求的状态,请考虑使用通知来确定状态。有关更多信息,请参见 任务状态通知。 |
是 |
429 | 限制异常 | 请求速率超出吞吐量上限。 |
您提交请求的速度太快;例如,创建新任务的请求。 如果您通过轮询来确定请求的状态,请考虑使用通知来确定状态。有关更多信息,请参见 任务状态通知。 |
是 |
500 | 内部故障 | 服务器在尝试完成请求时遇到内部错误。 | 服务器在处理您的请求时遇到错误。 | 是 |
500 | 内部服务器错误 | 服务器在尝试完成请求时遇到内部错误。 | 服务器在处理您的请求时遇到错误。 | 是 |
500 | 内部服务异常 | 服务在尝试完成请求时遇到意外异常。 | 是 | |
500 | 服务不可用异常 | 服务目前不可用或繁忙。 | 服务器在处理您的请求时出现意外错误。 | 是 |
错误响应示例
下面是一个 HTTP 响应,它表示 inputBucket
的值为 null (非有效值)。
HTTP/1.1 400 Bad Request x-amzn-RequestId: b0e91dc8-3807-11e2-83c6-5912bf8ad066 x-amzn-ErrorType: ValidationException Content-Type: application/json Content-Length: 124 Date: Mon, 26 Nov 2012 20:27:25 GMT {"message":"1 validation error detected: Value null at 'inputBucket' failed to satisfy constraint: Member must not be null"}
处理任务过程中出现错误
当 Elastic Transcoder 在处理任务过程中遇到错误时,它会通过两种方式报告错误:
-
任务状态和输出状态:Elastic Transcoder 会将失败输出的
Job:Status
对象和Outputs:Status
对象设置为Error
。此外,Elastic Transcoder 会将失败输出的Outputs:StatusDetail
JSON 对象设置为用于说明故障的值。 -
SNS 通知:如果您将管道配置为 Elastic Transcoder 在处理过程中遇到错误时发送 SNS 通知,Elastic Transcoder 会在通知中使用以下格式包含一个 JSON 对象:
{ "state" : "PROGRESSING|COMPLETED|WARNING|ERROR", "errorCode" : "
the code of any error that occurred
", "messageDetails" : "the notification message you created in Amazon SNS
", "version" : "API version that you used to create the job
", "jobId" : "value of Job:Id object that Elastic Transcoder returns in the response to a Create Job request
", "pipelineId" : "value of PipelineId object in the Create Job request
", "input" : {job Input settings
}, "outputKeyPrefix" : "prefix for file names in Amazon S3 bucket
", "outputs": [ {applicable job Outputs settings
, "status" : "Progressing|Complete|Warning|Error" }, {...} ], "playlists": [ {applicable job playlists settings
} ], "userMetadata": { "metadata key
": "metadata value
" } }
errorCode 的值 |
messageDetails 的值 |
原因 |
---|---|---|
1000 | 验证错误 | 在处理任务时,Elastic Transcoder 确定请求中的一个或多个值无效。 |
1001 | 依赖性错误 | Elastic Transcoder 无法生成播放列表,因为它的一个或多个播放列表依赖项遇到错误。 |
2000 | 无法代入角色 | Elastic Transcoder 无法代入在管道的 AWS Identity and Access Management 对象中为该任务指定的 Role 角色。 |
3000 | 未分类存储错误 | |
3001 | 输入不存在 | 不存在具有您在该任务的 Input:Key 对象中指定的名称的文件。该文件必须存在于在管道的 InputBucket 对象中为该任务指定的 Amazon S3 存储桶中。 |
3002 | 输出已存在 | 已存在具有您在该任务的 Outputs:Key (或 Output:Key )对象中指定的名称的文件。该文件不能存在于在管道的 OutputBucket 对象中为该任务指定的 Amazon S3 存储桶中。 |
3003 | 没有读取权限 | 在用于该任务的管道的 Role 对象中所指定的 IAM 角色没有读取其中包含要转码的文件的 Amazon S3 存储桶的权限。 |
3004 | 没有写入权限 | 在用于该任务的管道的 Role 对象中所指定的 IAM 角色没有要在其中保存已转码文件或缩略图文件的 Amazon S3 存储桶的写入权限。 |
3005 | 存储桶不存在 | 指定的 S3 存储桶不存在:存储桶={1}。 |
3006 | 没有写入权限 | Elastic Transcoder 无法将密钥={1} 写入到存储桶={2} 中,因为密钥与存储桶不在相同区域中 |
4000 | 错误输入文件 | 您在该任务的 Input:Key 对象中所指定文件的格式当前不受 Elastic Transcoder 的支持。 |
4001 | 错误输入文件 | 您在该任务的 Input:Key 对象中所指定文件的宽度 x 高度超出允许的最大宽度 x 高度。 |
4002 | 错误输入文件 | 您在该任务的 Input:Key 对象中所指定文件的文件大小超出允许的最大文件大小。 |
4003 | 错误输入文件 | Elastic Transcoder 无法解释您在该任务的其中一个 Outputs:Watermarks:InputKey 对象中指定的文件。 |
4004 | 错误输入文件 | 您在该任务的其中一个 Outputs:Watermarks:InputKey 对象中所指定文件的宽度 x 高度超出允许的最大宽度 x 高度。 |
4005 | 错误输入文件 | 您为其中一个 {1} 对象指定的文件的大小超出允许的最大大小:存储桶={2},密钥={3},大小={4},最大大小={5}。 |
4006 | 错误输入文件 | Elastic Transcoder 无法将输入文件转码,因为格式不受支持。 |
4007 | 未处理的输入文件 | Elastic Transcoder 遇到通常支持的文件类型,但无法正确处理该文件。此错误会自动打开一个支持案例,我们已开始研究问题的原因。 |
4008 | 错误输入文件 |
该问题的根本原因是预设和输入文件不匹配。示例包括:
|
4009 | 错误输入文件 | Elastic Transcoder 无法将所有专辑封面插入输出文件中,因为已超出最大数量的艺术作品流。 |
4010 | 错误输入文件 | Elastic Transcoder 无法解释您为 AlbumArt:Artwork:InputKey 指定的图像文件。 |
4011 | 错误输入文件 | Elastic Transcoder 检测到嵌入式艺术作品流,但无法解释它。 |
4012 | 错误输入文件 | 为 AlbumArt:Artwork 指定的图像超出允许的最大宽度 x 高度:4096 x 3072。 |
4013 | 错误输入文件 | 嵌入式插图的宽度 x 高度超出允许的最大宽度 x 高度:4096 x 3072。 |
4014 | 错误输入 | 为剪辑开始时间指定的值晚于输入文件的结束时间。Elastic Transcoder 无法创建输出文件。 |
4015 | 错误输入 | Elastic Transcoder 无法生成清单文件,因为生成的段不匹配。 |
4016 | 错误输入 | Elastic Transcoder 无法使用 {2} 将来自 {1} 的输入文件解密。 |
4017 | 错误输入 | AES 密钥使用 {2} 位加密密钥进行加密。AES 仅支持 128、192 和 256 位加密密钥。MD5={1}。 |
4018 | 错误输入 | Elastic Transcoder 无法使用 MD5={1} 将密码密钥解密 |
4019 | 错误输入 | Elastic Transcoder 无法使用 KMS 密钥 ARN {0} 生成数据密钥。 |
4020 | 错误输入 | 进行 AES-128 加密时,您的密钥必须是 128 位。MD5={1},{2} 位。 |
4021 | 错误输入 | 对于 PlayReady DRM,您的密钥必须是 128 位。MD5={1},强度={2} 位。 |
4022 | 错误输入 | {1} 所指定媒体文件的组合大小超出允许的最大大小:存储桶={2},大小={3}。 |
4023 | 错误输入 | 指定要联接的 {1} 输入文件不会使用与指定预设一致的分辨率创建输出。使用具有不同 PaddingPolicy 、SizingPolicy 、MaxWidth 和 MaxHeight 设置的预设。 |
4024 | 错误输入 | 指定要联接的 {1} 输入文件不会使用与指定预设一致的分辨率创建缩略图。使用具有不同缩略图 PaddingPolicy 、SizingPolicy 、MaxWidth 和 MaxHeight 设置的预设。 |
4025 | 错误输入 | 至少有一个媒体文件(输入 #{1})与其他文件不匹配。所有媒体文件必须都包含视频或都不包含视频。 |
4026 | 错误输入 | 至少有一个媒体文件(输入 #{1})与其他文件不匹配。所有媒体文件必须都包含音频或都不包含音频。 |
4100 | 错误输入文件 | Elastic Transcoder 检测到嵌入的字幕轨迹,但无法解释它。 |
4101 | 错误输入文件 | Elastic Transcoder 无法解释为 Amazon S3 存储桶={1}、密钥={2} 指定的字幕文件。 |
4102 | 错误输入文件 | Elastic Transcoder 无法解释指定的字幕文件,因为它不是 UTF-8 编码:Amazon S3 存储桶={1},密钥={2}。 |
4103 | 错误输入文件 | Elastic Transcoder 无法处理所有字幕轨迹,因为已超出字幕轨迹的最大数量 {1}。 |
4104 | 错误输入文件 | Elastic Transcoder 无法生成主播放列表,因为所需的输出包含 {1} 个嵌入式字幕,而最大值为 4。 |
4105 | 错误输入文件 | Elastic Transcoder 无法嵌入字幕轨迹,因为对于 CEA-708 不支持帧速率 {1},仅支持帧速率 [29.97, 30]。 |
4106 | 错误输入文件 | Elastic Transcoder 无法嵌入字幕轨迹,因为格式 {1} 仅支持 {2} 个字幕轨迹。 |
9000 | 内部服务错误 | |
9001 | 内部服务错误 | |
9999 | 内部服务错误 |
抓取错误
为了让您的应用程序平稳运行,您需要构建逻辑以捕获和响应错误。一种典型的方法是在 try
数据块或 if-then
语句中实施您的请求。
AWS 开发工具包自己也会重试和检查错误。如果您在使用某个 AWS 开发工具包时遇到错误,则您将会看到错误代码和错误描述。您还会看到一个 Request ID
值。Request ID
值可以帮助 Elastic Transcoder 支持人员排除错误。
以下示例使用适用于 Java 的 AWS SDK 删除 try
数据块中的一个项目,并使用 catch
数据块就错误给出响应。在本示例中,系统会发出请求失败的警告。该示例使用 AmazonServiceException
类检索有关操作错误的信息(包括 Request ID
)。该示例还使用了 AmazonClientException
类,以处理请求因其他原因失败的情况。
try { DeleteJobRequest request = new DeleteJobRequest(jobId); DeleteJobResult result = ET.deleteJob(request); System.out.println("Result: " + result); // Get error information from the service while trying to run the operation } catch (AmazonServiceException ase) { System.err.println("Failed to delete job " + jobId); // Get specific error information System.out.println("Error Message: " + ase.getMessage()); System.out.println("HTTP Status Code: " + ase.getStatusCode()); System.out.println("AWS Error Code: " + ase.getErrorCode()); System.out.println("Error Type: " + ase.getErrorType()); System.out.println("Request ID: " + ase.getRequestId()); // Get information in case the operation is not successful for other reasons } catch (AmazonClientException ace) { System.out.println("Caught an AmazonClientException, which means"+ " the client encountered " + "an internal error while trying to " + "communicate with Elastic Transcoder, " + "such as not being able to access the network."); System.out.println("Error Message: " + ace.getMessage()); }
错误重试和指数回退
网络上的大量组件 (例如 DNS 服务器、交换机、负载均衡器等) 都可能在某个指定请求生命周期中的任一环节出现问题。
在联网环境中,处理这些错误响应的常规技术是在客户应用程序中实施重试。该技术可以提高应用程序的可靠性和降低开发人员的操作成本。
每个支持 Elastic Transcoder 的 AWS SDK 都将实施自动重试逻辑。适用于 Java 的 AWS SDK 会自动重试请求,您可以使用 ClientConfiguration
类配置重试设置。例如,有时候网页发出的请求采用最低延迟并且不想重试,您可能会希望关闭重试逻辑。您可以使用 ClientConfiguration
类,并且为 maxErrorRetry
提供 0
值,从而设置为不重试。
如果您没有使用 AWS SDK,则应当对收到服务器错误 (5xx) 的原始请求执行重试。但是,客户端错误(4xx,不是 ThrottlingException
或 ProvisionedThroughputExceededException
)表示您需要对请求本身进行修改,先修正了错误然后再重试。
注意
如果您通过轮询来确定请求的状态,并且 Elastic Transcoder 正在返回 HTTP 状态代码 429,错误代码为 Provisioned Throughput Exceeded
Exception
或 Throttling Exception
,请考虑使用通知而不是轮询来确定状态。有关更多信息,请参见 任务状态通知。
除了简单重试之外,我们还建议使用指数回退算法来实现更好的流程控制。指数回退的原理是对于连续错误响应,重试等待间隔越来越长。例如,您可能会允许经过 1 秒后进行第一次重试,经过 4 秒后进行第二次重试,经过 16 秒后进行第三次重试,以此类推。但是,如果一分钟后请求未成功,则问题可能在于硬限制而不是请求速率。例如,您可能已达到允许的最大管道数量。您可以设置最大重试次数,在大约一分钟的时候停止重试。
以下是显示重试逻辑的一个工作流程。该工作流程逻辑首先确定遇到的是不是服务器错误 (5xx)。如果遇到的是服务器错误,代码就会重试原始请求。
currentRetry = 0 DO set retry to false execute Elastic Transcoder request IF Exception.errorCode = ProvisionedThroughputExceededException set retry to true ELSE IF Exception.httpStatusCode = 500 set retry to true ELSE IF Exception.httpStatusCode = 400 set retry to false fix client error (4xx) IF retry = true wait for (2^currentRetry * 50) milliseconds currentRetry = currentRetry + 1 WHILE (retry = true AND currentRetry < MaxNumberOfRetries) // limit retries