【问题标题】:Error creating mediaconvert job for HLS output with mp4, mp3 and SRT as input使用 mp4、mp3 和 SRT 作为输入为 HLS 输出创建 mediaconvert 作业时出错
【发布时间】:2021-12-30 09:01:07
【问题描述】:

我正在尝试编写一个 Go 代码以在 MediaConvert 上创建一个作业,该作业将 MP4 视频作为输入,一些 MP3 用作不同的音轨,一些 SRT 文件用于字幕。

我的 Go 代码生成了这个发送到 AWS 的 JSON:

{
    "clientRequestToken": "---",
    "role": "---",
    "settings": {
        "inputs": [{
            "audioSelectors": {
                "ENG": {
                    "defaultSelection": "NOT_DEFAULT",
                    "externalAudioFileInput": "s3://mybucket/test/sample1.mp3",
                    "languageCode": "ENG",
                    "offset": 0,
                    "programSelection": 1,
                    "selectorType": "TRACK"
                },
                "SPA": {
                    "defaultSelection": "NOT_DEFAULT",
                    "externalAudioFileInput": "s3://mybucket/test/sample3.mp3",
                    "languageCode": "SPA",
                    "offset": 0,
                    "programSelection": 1,
                    "selectorType": "TRACK"
                },
                "floor": {
                    "defaultSelection": "DEFAULT",
                    "offset": 0,
                    "programSelection": 1
                }
            },
            "captionSelectors": {
                "ENG": {
                    "languageCode": "ENG",
                    "sourceSettings": {
                        "fileSourceSettings": {
                            "sourceFile": "s3://mybucket/test/eng.srt"
                        },
                        "sourceType": "SRT"
                    }
                },
                "SPA": {
                    "languageCode": "SPA",
                    "sourceSettings": {
                        "fileSourceSettings": {
                            "sourceFile": "s3://mybucket/test/spa.srt"
                        },
                        "sourceType": "SRT"
                    }
                }
            },
            "deblockFilter": "DISABLED",
            "denoiseFilter": "DISABLED",
            "fileInput": "s3://mybucket/test/video.mp4",
            "filterEnable": "AUTO",
            "psiControl": "USE_PSI",
            "timecodeSource": "EMBEDDED",
            "videoSelector": {
                "alphaBehavior": "DISCARD",
                "colorSpace": "FOLLOW",
                "rotate": "DEGREE_0"
            }
        }],
        "outputGroups": [{
            "name": "Apple HLS",
            "outputGroupSettings": {
                "hlsGroupSettings": {
                    "captionLanguageSetting": "OMIT",
                    "clientCache": "ENABLED",
                    "codecSpecification": "RFC_4281",
                    "destination": "s3://mybucket/1/encoded",
                    "directoryStructure": "SINGLE_DIRECTORY",
                    "manifestCompression": "NONE",
                    "manifestDurationFormat": "INTEGER",
                    "minSegmentLength": 0,
                    "outputSelection": "MANIFESTS_AND_SEGMENTS",
                    "programDateTime": "EXCLUDE",
                    "programDateTimePeriod": 600,
                    "segmentControl": "SEGMENTED_FILES",
                    "segmentLength": 5,
                    "streamInfResolution": "INCLUDE",
                    "timedMetadataId3Period": 10
                },
                "type": "HLS_GROUP_SETTINGS"
            },
            "outputs": [{
                "audioDescriptions": [{
                        "audioSourceName": "floor",
                        "codecSettings": {
                            "aacSettings": {
                                "audioDescriptionBroadcasterMix": "NORMAL",
                                "bitrate": 96000,
                                "codecProfile": "LC",
                                "codingMode": "CODING_MODE_2_0",
                                "rateControlMode": "CBR",
                                "rawFormat": "NONE",
                                "sampleRate": 48000,
                                "specification": "MPEG4"
                            },
                            "codec": "AAC"
                        },
                        "languageCode": "FOLLOW_INPUT"
                    },
                    {
                        "audioSourceName": "ENG",
                        "codecSettings": {
                            "aacSettings": {
                                "audioDescriptionBroadcasterMix": "NORMAL",
                                "bitrate": 96000,
                                "codecProfile": "LC",
                                "codingMode": "CODING_MODE_2_0",
                                "rateControlMode": "CBR",
                                "rawFormat": "NONE",
                                "sampleRate": 48000,
                                "specification": "MPEG4"
                            },
                            "codec": "AAC"
                        },
                        "languageCode": "FOLLOW_INPUT"
                    },
                    {
                        "audioSourceName": "SPA",
                        "codecSettings": {
                            "aacSettings": {
                                "audioDescriptionBroadcasterMix": "NORMAL",
                                "bitrate": 96000,
                                "codecProfile": "LC",
                                "codingMode": "CODING_MODE_2_0",
                                "rateControlMode": "CBR",
                                "rawFormat": "NONE",
                                "sampleRate": 48000,
                                "specification": "MPEG4"
                            },
                            "codec": "AAC"
                        },
                        "languageCode": "FOLLOW_INPUT"
                    }
                ],
                "captionDescriptions": [{
                        "captionSelectorName": "ENG",
                        "destinationSettings": {
                            "destinationType": "EMBEDDED"
                        }
                    },
                    {
                        "captionSelectorName": "SPA",
                        "destinationSettings": {
                            "destinationType": "EMBEDDED"
                        }
                    }
                ],
                "containerSettings": {
                    "container": "M3U8",
                    "m3u8Settings": {}
                },
                "extension": "m3u8",
                "nameModifier": "1",
                "outputSettings": {
                    "hlsSettings": {
                        "audioGroupId": "program_audio",
                        "audioOnlyContainer": "AUTOMATIC",
                        "iFrameOnlyManifest": "EXCLUDE"
                    }
                },
                "videoDescription": {
                    "afdSignaling": "NONE",
                    "antiAlias": "ENABLED",
                    "codecSettings": {
                        "codec": "H_264",
                        "h264Settings": {
                            "adaptiveQuantization": "HIGH",
                            "codecLevel": "AUTO",
                            "codecProfile": "MAIN",
                            "dynamicSubGop": "STATIC",
                            "entropyEncoding": "CABAC",
                            "fieldEncoding": "PAFF",
                            "flickerAdaptiveQuantization": "DISABLED",
                            "framerateControl": "INITIALIZE_FROM_SOURCE",
                            "framerateConversionAlgorithm": "DUPLICATE_DROP",
                            "gopBReference": "DISABLED",
                            "gopClosedCadence": 0,
                            "gopSize": 90,
                            "gopSizeUnits": "FRAMES",
                            "interlaceMode": "PROGRESSIVE",
                            "maxBitrate": 5000000,
                            "minIInterval": 0,
                            "numberBFramesBetweenReferenceFrames": 2,
                            "numberReferenceFrames": 3,
                            "parControl": "INITIALIZE_FROM_SOURCE",
                            "qualityTuningLevel": "SINGLE_PASS",
                            "rateControlMode": "QVBR",
                            "repeatPps": "DISABLED",
                            "sceneChangeDetect": "ENABLED",
                            "slices": 1,
                            "slowPal": "DISABLED",
                            "softness": 0,
                            "spatialAdaptiveQuantization": "ENABLED",
                            "syntax": "DEFAULT",
                            "telecine": "NONE",
                            "temporalAdaptiveQuantization": "ENABLED",
                            "unregisteredSeiTimecode": "DISABLED"
                        }
                    },
                    "colorMetadata": "INSERT",
                    "dropFrameTimecode": "ENABLED",
                    "respondToAfd": "NONE",
                    "scalingBehavior": "DEFAULT",
                    "sharpness": 50,
                    "timecodeInsertion": "DISABLED"
                }
            }]
        }],
        "timecodeConfig": {
            "source": "ZEROBASED"
        }
    },
    "tags": {
        "Env": "dev"
    }
}

我的问题是rest api返回错误400错误请求并带有消息:

"message" : "The request could not be interpreted.","settingsValidationErrorsJsonBlob" : ""

有人可以给我一些建议以了解可能是什么问题吗?

谢谢!

【问题讨论】:

    标签: json amazon-web-services aws-media-convert


    【解决方案1】:

    首先,让我先说我不熟悉 Go,因此我将您的 JSON 转换为 pascal 案例并通过 AWS CLI 进行了测试。我已将我的结果转换回下面的驼峰式案例。

    根据我的发现 - 您在 JSON 的开头和结尾处似乎有一些无关的文本。从顶部删除以下位后:

    {
      "clientRequestToken": "---",
      "role": "---",
      "settings": 
    

    以及从底部开始的以下内容

    ,
      "tags": {
        "Env": "dev"
      }
    }
    

    我收到了不同的错误响应:

    An error occurred (BadRequestException) when calling the CreateJob operation: The request could not be interpreted.
    

    深入研究后,我注意到您的输入音频选择器中还有一些相互矛盾的参数。如果我不得不猜测,如果我错了,请纠正我,您正在尝试在音频选择器声明中设置语言代码。这是音频选择器之一,以突出我在说什么:

                    "ENG": {
                        "defaultSelection": "NOT_DEFAULT",
                        "externalAudioFileInput": "s3://mybucket/test/sample1.mp3",
                        "languageCode": "ENG",
                        "offset": 0,
                        "programSelection": 1,
                        "selectorType": "TRACK"
                    }
    

    "languageCode": "ENG" 告诉 MediaConvert 您要从音频源文件中提取 ENG 音轨,但是您还声明了 "selectorType": "TRACK" 告诉 MediaConvert 您要提取音频按轨道号。由于您指定了轨道选择器类型,我假设您实际上只是想从音频文件中提取轨道 1 并将音频选择器修改为如下所示:

            "ENG": {
              "tracks": [
                1
              ],
              "defaultSelection": "NOT_DEFAULT",
              "selectorType": "TRACK",
              "externalAudioFileInput": "s3://mybucket/test/sample1.mp3"
            },
    

    如果我猜错了,而您确实打算使用 ENG 音轨,那么该节应如下所示:

              "ENG": {
                "DefaultSelection": "NOT_DEFAULT",
                "SelectorType": "LANGUAGE_CODE",
                "ExternalAudioFileInput": "s3://mybucket/test/sample1.mp3",
                "LanguageCode": "ENG"
              },
    

    最后,我将语言代码移至 ENG 和 SPA 音轨的输出,您需要在此处调用它们。另请注意,FOLLOW_INPUT 对 LanguageCode 无效,因此我已将这些键更改为 LanguageCodeControl。这是有效的 JSON:

    {
      "inputs": [
        {
          "audioSelectors": {
            "ENG": {
              "tracks": [
                1
              ],
              "defaultSelection": "NOT_DEFAULT",
              "selectorType": "TRACK",
              "externalAudioFileInput": "s3://mybucket/test/sample1.mp3"
            },
            "SPA": {
              "tracks": [
                1
              ],
              "defaultSelection": "NOT_DEFAULT",
              "selectorType": "TRACK",
              "externalAudioFileInput": "s3://mybucket/test/sample3.mp3"
            },
            "floor": {
              "defaultSelection": "DEFAULT"
            }
          },
          "captionSelectors": {
            "ENG": {
              "languageCode": "ENG",
              "sourceSettings": {
                "fileSourceSettings": {
                  "sourceFile": "s3://mybucket/test/eng.srt"
                },
                "sourceType": "SRT"
              }
            },
            "SPA": {
              "languageCode": "SPA",
              "sourceSettings": {
                "fileSourceSettings": {
                  "sourceFile": "s3://mybucket/test/spa.srt"
                },
                "sourceType": "SRT"
              }
            }
          },
          "deblockFilter": "DISABLED",
          "denoiseFilter": "DISABLED",
          "fileInput": "s3://mybucket/test/video.mp4",
          "filterEnable": "AUTO",
          "psiControl": "USE_PSI",
          "timecodeSource": "EMBEDDED",
          "videoSelector": {
            "alphaBehavior": "DISCARD",
            "colorSpace": "FOLLOW",
            "rotate": "DEGREE_0"
          }
        }
      ],
      "outputGroups": [
        {
          "name": "Apple HLS",
          "outputGroupSettings": {
            "hlsGroupSettings": {
              "captionLanguageSetting": "OMIT",
              "clientCache": "ENABLED",
              "codecSpecification": "RFC_4281",
              "destination": "s3://mybucket/1/encoded",
              "directoryStructure": "SINGLE_DIRECTORY",
              "manifestCompression": "NONE",
              "manifestDurationFormat": "INTEGER",
              "minSegmentLength": 0,
              "outputSelection": "MANIFESTS_AND_SEGMENTS",
              "programDateTime": "EXCLUDE",
              "programDateTimePeriod": 600,
              "segmentControl": "SEGMENTED_FILES",
              "segmentLength": 5,
              "streamInfResolution": "INCLUDE",
              "timedMetadataId3Period": 10
            },
            "type": "HLS_GROUP_SETTINGS"
          },
          "outputs": [
            {
              "audioDescriptions": [
                {
                  "audioSourceName": "floor",
                  "codecSettings": {
                    "aacSettings": {
                      "audioDescriptionBroadcasterMix": "NORMAL",
                      "bitrate": 96000,
                      "codecProfile": "LC",
                      "codingMode": "CODING_MODE_2_0",
                      "rateControlMode": "CBR",
                      "rawFormat": "NONE",
                      "sampleRate": 48000,
                      "specification": "MPEG4"
                    },
                    "codec": "AAC"
                  },
                  "languageCodeControl": "FOLLOW_INPUT"
                },
                {
                  "audioSourceName": "ENG",
                  "codecSettings": {
                    "aacSettings": {
                      "audioDescriptionBroadcasterMix": "NORMAL",
                      "bitrate": 96000,
                      "codecProfile": "LC",
                      "codingMode": "CODING_MODE_2_0",
                      "rateControlMode": "CBR",
                      "rawFormat": "NONE",
                      "sampleRate": 48000,
                      "specification": "MPEG4"
                    },
                    "codec": "AAC"
                  },
                  "languageCode": "ENG"
                },
                {
                  "audioSourceName": "SPA",
                  "codecSettings": {
                    "aacSettings": {
                      "audioDescriptionBroadcasterMix": "NORMAL",
                      "bitrate": 96000,
                      "codecProfile": "LC",
                      "codingMode": "CODING_MODE_2_0",
                      "rateControlMode": "CBR",
                      "rawFormat": "NONE",
                      "sampleRate": 48000,
                      "specification": "MPEG4"
                    },
                    "codec": "AAC"
                  },
                  "languageCode": "SPA"
                }
              ],
              "captionDescriptions": [
                {
                  "captionSelectorName": "ENG",
                  "destinationSettings": {
                    "destinationType": "EMBEDDED"
                  }
                },
                {
                  "captionSelectorName": "SPA",
                  "destinationSettings": {
                    "destinationType": "EMBEDDED"
                  }
                }
              ],
              "containerSettings": {
                "container": "M3U8",
                "m3u8Settings": {}
              },
              "extension": "m3u8",
              "nameModifier": "1",
              "outputSettings": {
                "hlsSettings": {
                  "audioGroupId": "program_audio",
                  "audioOnlyContainer": "AUTOMATIC",
                  "iFrameOnlyManifest": "EXCLUDE"
                }
              },
              "videoDescription": {
                "afdSignaling": "NONE",
                "antiAlias": "ENABLED",
                "codecSettings": {
                  "codec": "H_264",
                  "h264Settings": {
                    "adaptiveQuantization": "HIGH",
                    "codecLevel": "AUTO",
                    "codecProfile": "MAIN",
                    "dynamicSubGop": "STATIC",
                    "entropyEncoding": "CABAC",
                    "fieldEncoding": "PAFF",
                    "flickerAdaptiveQuantization": "DISABLED",
                    "framerateControl": "INITIALIZE_FROM_SOURCE",
                    "framerateConversionAlgorithm": "DUPLICATE_DROP",
                    "gopBReference": "DISABLED",
                    "gopClosedCadence": 0,
                    "gopSize": 90,
                    "gopSizeUnits": "FRAMES",
                    "interlaceMode": "PROGRESSIVE",
                    "maxBitrate": 5000000,
                    "minIInterval": 0,
                    "numberBFramesBetweenReferenceFrames": 2,
                    "numberReferenceFrames": 3,
                    "parControl": "INITIALIZE_FROM_SOURCE",
                    "qualityTuningLevel": "SINGLE_PASS",
                    "rateControlMode": "QVBR",
                    "repeatPps": "DISABLED",
                    "sceneChangeDetect": "ENABLED",
                    "slices": 1,
                    "slowPal": "DISABLED",
                    "softness": 0,
                    "spatialAdaptiveQuantization": "ENABLED",
                    "syntax": "DEFAULT",
                    "telecine": "NONE",
                    "temporalAdaptiveQuantization": "ENABLED",
                    "unregisteredSeiTimecode": "DISABLED"
                  }
                },
                "colorMetadata": "INSERT",
                "dropFrameTimecode": "ENABLED",
                "respondToAfd": "NONE",
                "scalingBehavior": "DEFAULT",
                "sharpness": 50,
                "timecodeInsertion": "DISABLED"
              }
            }
          ]
        }
      ],
      "timecodeConfig": {
        "source": "ZEROBASED"
      }
    }
    

    【讨论】:

    • 你好杰夫!非常感谢!我在 GO 中转换了你的 json,看起来效果很好!我现在将做一些测试以了解是否一切顺利。再次感谢您!
    • 使用您的代码和 SRT 字幕我收到该错误:媒体目标 [1] 无法将非 EIA-608 转换为 EIA-608(尝试从 SRT 到嵌入式的转换无效。请给我一个建议?
    • 嘿 Jayyrus 我很高兴它成功了!感谢您提到您遇到的验证错误。我以前应该注意到的。在用户指南中有一个部分概述了受支持的字幕工作流程,看起来 SRT -> HLS 不支持嵌入式。您需要使用 WebVTT(或老化):docs.aws.amazon.com/mediaconvert/latest/ug/… 根据我的经验,WebVTT 是 HLS 字幕的典型代表。
    • 在输出中使用 WebVTT,我收到无效的消息。我应该将字幕移动到其他输出吗?那么一个输出带有视频 + 音频,另一个输出只有字幕?
    • 没错,WebVTT 需要与混合的音频/视频再现分开。您将在输出中看到“.vtt”文件,如果观众选择字幕轨道,客户端播放器将请求该文件。
    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多