使用Go AWS SDK创建AWS MediaLive通道时遇UnprocessableEntityException错误
这个错误提示确实有点误导性——你明明已经在CreateChannelInput里设置了Destinations字段,但服务端却报找不到destination属性。根据我处理MediaLive API的经验,这个问题几乎都是输出组(OutputGroup)的输出配置没有正确关联到目标地址导致的,和你顶层的Destinations配置无关,下面是具体的排查步骤:
第一步:给Outputs配置关联DestinationId和必要的输出设置
你代码里的Outputs: []*medialive.Output{&medialive.Output{}}是完全空的配置,MediaLive需要知道每个输出组的输出对应到哪个目标地址(也就是你顶层Destinations里的Id),同时还要指定输出类型。修改后的代码应该类似这样:Outputs: []*medialive.Output{ &medialive.Output{ DestinationId: &destinationID, // 必须和Destinations里的Id完全匹配 OutputSettings: &medialive.OutputSettings{ HlsOutputSettings: &medialive.HlsOutputSettings{}, // 因为你用的是HlsGroupSettings,这里要对应Hls输出配置 }, // 还可以根据需要添加AudioDescriptionNames、VideoDescriptionName等关联字段 }, }空的Output会让服务端找不到对应的目标配置,从而抛出这个奇怪的"destination undefined"错误。
第二步:验证Destinations里的Settings变量不为空
虽然你代码里写了Url: destinationA.HlsIngest.IngestEndpoints[0].Url,但要确保这些变量不是空值。可以在调用CreateChannel前加日志打印确认:log.Printf("Dest A URL: %v, Username: %v", destinationA.HlsIngest.IngestEndpoints[0].Url, destinationA.HlsIngest.IngestEndpoints[0].Username) log.Printf("Dest B URL: %v, Username: %v", destinationB.HlsIngest.IngestEndpoints[0].Url, destinationB.HlsIngest.IngestEndpoints[0].Username)如果某个Url或Username是空的,服务端解析时会出错,间接触发这个错误提示。
第三步:补全OutputGroupSettings的必填配置
你的HlsGroupSettings只设置了HlsWebdavSettings,但缺少一些关键的必填项(比如分片长度、播放列表类型),这也可能导致服务端校验失败。建议补充基础配置:HlsGroupSettings: &medialive.HlsGroupSettings{ HlsCdnSettings: &medialive.HlsCdnSettings{ HlsWebdavSettings: &medialive.HlsWebdavSettings{}, }, SegmentLength: aws.Int64(10), // 分片长度,单位秒 PlaylistType: medialive.HlsPlaylistTypeEvent, // 播放列表类型,根据你的业务场景选择 },第四步:验证InputAttachment的有效性
确保input.Input.Id是一个已经创建完成、状态正常的MediaLive Input ID,并且没有被其他通道占用。无效的Input也可能导致服务端处理请求时出现异常,返回看似不相关的错误。第五步:用AWS CLI交叉验证配置
有时候SDK的指针类型初始化可能有隐藏问题,你可以把配置转换成AWS CLI命令手动执行,看是否能成功:aws medialive create-channel \ --name "your-channel-name" \ --role-arn "your-role-arn" \ --input-attachments '[{"InputId": "your-input-id"}]' \ --destinations '[{"Id": "your-dest-id", "Settings": [{"Url": "url-a", "Username": "user-a", "PasswordParam": "param1"}, {"Url": "url-b", "Username": "user-b", "PasswordParam": "param2"}]}]' \ --encoder-settings '{"OutputGroups": [{"OutputGroupSettings": {"HlsGroupSettings": {"HlsCdnSettings": {"HlsWebdavSettings": {}}, "SegmentLength": 10, "PlaylistType": "EVENT"}, "Outputs": [{"DestinationId": "your-dest-id", "OutputSettings": {"HlsOutputSettings": {}}}]}}, {"VideoDescriptions": [{"Height": your-height, "Width": your-width, "CodecSettings": {"H264Settings": {"FramerateDenominator": your-framerate}}]}]}'如果CLI执行成功,说明是SDK代码里的字段配置问题;如果CLI也失败,就能得到更准确的错误提示,方便定位问题。
内容的提问来源于stack exchange,提问作者Galil

