You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS MediaConvert添加外部音频后HLS视频黑屏或加载异常求助

AWS MediaConvert生成带外部备选音轨的HLS输出异常解决

需求与目标

  • 基于带默认英文音轨的单个视频文件,用MediaConvert生成HLS输出
  • 额外加入S3存储的外部MP3作为备选音轨
  • 最终输出包含:1条视频流、原视频默认音轨、外部MP3备选音轨

遇到的问题

  • 播放时偶尔出现黑屏,无视频画面
  • 播放清单偶尔无效,或备选音轨无法加载

当前使用的MediaConvert任务配置

{
  "Inputs": [
    {
      "FileInput": "s3://your-bucket/path/to/video-input.mp4",
      "AudioSelectors": {
        "Audio Selector 1": {
          "DefaultSelection": "DEFAULT"
        },
        "Audio Selector 2": {
          "ExternalAudioFileInput": "s3://your-bucket/path/to/external-audio.mp3"
        }
      },
      "VideoSelector": {
        "ColorSpace": "FOLLOW"
      },
      "TimecodeSource": "ZEROBASED"
    }
  ],
  "OutputGroups": [
    {
      "Name": "Apple HLS",
      "OutputGroupSettings": {
        "Type": "HLS_GROUP_SETTINGS",
        "HlsGroupSettings": {
          "Destination": "s3://your-output-bucket/path/to/hls-output/",
          "SegmentLength": 6,
          "MinSegmentLength": 0,
          "SegmentControl": "SEGMENTED_FILES",
          "ManifestDurationFormat": "INTEGER",
          "OutputSelection": "MANIFESTS_AND_SEGMENTS",
          "AdMarkers": ["ELEMENTAL"],
          "TimedMetadataId3Frame": "PRIV",
          "TimedMetadataId3Period": 10,
          "ProgramDateTime": "INCLUDE",
          "AudioOnlyHeader": "INCLUDE",
          "CaptionLanguageSetting": "OMIT"
        }
      },
      "Outputs": [
        {
          "NameModifier": "_video",
          "ContainerSettings": {
            "Container": "M3U8",
            "M3u8Settings": {
              "Scte35Source": "PASSTHROUGH",
              "AudioFramesPerPes": 4,
              "PcrControl": "PCR_EVERY_PES_PACKET",
              "PmtPid": 480,
              "PrivateMetadataPid": 503,
              "ProgramNumber": 1,
              "PatInterval": 0,
              "PmtInterval": 0,
              "VideoPid": 481,
              "AudioPids": [482]
            }
          },
          "VideoDescription": {
            "Width": 1280,
            "Height": 720,
            "ScalingBehavior": "DEFAULT",
            "TimecodeInsertion": "DISABLED",
            "AntiAlias": "ENABLED",
            "Sharpness": 50,
            "CodecSettings": {
              "Codec": "H_264",
              "H264Settings": {
                "InterlaceMode": "PROGRESSIVE",
                "NumberReferenceFrames": 3,
                "Syntax": "DEFAULT",
                "Softness": 0,
                "GopClosedCadence": 1,
                "GopSize": 90,
                "Slices": 1,
                "GopBReference": "DISABLED",
                "SlowPal": "DISABLED",
                "EntropyEncoding": "CABAC",
                "Bitrate": 4000000,
                "FramerateControl": "SPECIFIED",
                "FramerateNumerator": 30,
                "FramerateDenominator": 1,
                "RateControlMode": "CBR",
                "CodecProfile": "MAIN",
                "Telecine": "NONE",
                "MinIInterval": 0,
                "AdaptiveQuantization": "AUTO",
                "FramerateConversionAlgorithm": "DUPLICATE_DROP",
                "SceneChangeDetect": "ENABLED",
                "QualityTuningLevel": "SINGLE_PASS_HQ",
                "GopSizeUnits": "FRAMES",
                "ParNumerator": 1,
                "ParDenominator": 1
              }
            }
          },
          "AudioDescriptions": [
            {
              "AudioSourceName": "Audio Selector 1",
              "LanguageCode": "ENG",
              "LanguageCodeControl": "USE_CONFIGURED",
              "AudioTypeControl": "FOLLOW_INPUT",
              "CodecSettings": {
                "Codec": "AAC",
                "AacSettings": {
                  "AudioDescriptionBroadcasterMix": "NORMAL",
                  "Bitrate": 96000,
                  "RateControlMode": "CBR",
                  "CodecProfile": "LC",
                  "CodingMode": "CODING_MODE_2_0",
                  "RawFormat": "NONE",
                  "SampleRate": 48000,
                  "Specification": "MPEG4"
                }
              },
              "StreamName": "Default Audio"
            }
          ],
          "OutputSettings": {
            "HlsSettings": {
              "AudioGroupId": "audio_group",
              "AudioTrackType": "ALTERNATE_AUDIO_AUTO_SELECT",
              "IFrameOnlyManifest": "EXCLUDE"
            }
          }
        },
        {
          "NameModifier": "_audio_alt",
          "ContainerSettings": {
            "Container": "M3U8",
            "M3u8Settings": {
              "Scte35Source": "PASSTHROUGH",
              "AudioFramesPerPes": 4,
              "PcrControl": "PCR_EVERY_PES_PACKET",
              "PmtPid": 480,
              "PrivateMetadataPid": 503,
              "ProgramNumber": 1,
              "PatInterval": 0,
              "PmtInterval": 0,
              "AudioPids": [482]
            }
          },
          "AudioDescriptions": [
            {
              "AudioSourceName": "Audio Selector 2",
              "LanguageCode": "ENG",
              "LanguageCodeControl": "USE_CONFIGURED",
              "AudioTypeControl": "FOLLOW_INPUT",
              "RemixSettings": {
                "ChannelsIn": 1,
                "ChannelsOut": 2,
                "ChannelMapping": {
                  "OutputChannels": [
                    { "InputChannels": [0] },
                    { "InputChannels": [0] }
                  ]
                }
              },
              "CodecSettings": {
                "Codec": "AAC",
                "AacSettings": {
                  "AudioDescriptionBroadcasterMix": "NORMAL",
                  "Bitrate": 96000,
                  "RateControlMode": "CBR",
                  "CodecProfile": "LC",
                  "CodingMode": "CODING_MODE_2_0",
                  "RawFormat": "NONE",
                  "SampleRate": 48000,
                  "Specification": "MPEG4"
                }
              },
              "StreamName": "Alternate Audio"
            }
          ],
          "OutputSettings": {
            "HlsSettings": {
              "AudioGroupId": "audio_group",
              "AudioTrackType": "AUDIO_ONLY_VARIANT_STREAM",
              "SegmentModifier": "audio_alt"
            }
          }
        }
      ]
    }
  ],
  "TimecodeConfig": {
    "Source": "ZEROBASED"
  }
}

问题排查与修复方案

你的配置里有几个关键问题导致了这些异常,按以下步骤修改:

1. 修正视频流的音频轨道类型

当前视频输出的AudioTrackType被设为ALTERNATE_AUDIO_AUTO_SELECT,这会让播放器把带视频的流识别成备选音频流,优先加载纯音频流,直接导致黑屏。要改成MAIN_AUDIO,明确这是带主音频的视频主流。

修改位置:第一个输出(带视频的那个)的OutputSettings.HlsSettings.AudioTrackType

"AudioTrackType": "MAIN_AUDIO"

2. 修正ProgramNumber冲突

两个输出的ProgramNumber都设为1,HLS规范里同个播放清单的ProgramNumber必须唯一,重复会导致清单解析失败。把备选音频输出的ProgramNumber改成2。

修改位置:第二个输出(纯音频的那个)的ContainerSettings.M3u8Settings.ProgramNumber

"ProgramNumber": 2

3. 修正音频PID冲突

两个输出的AudioPids都用了[482],同个播放清单内音频PID不能重复,会导致音频轨道识别混乱。把备选音频的AudioPids改成[483]。

修改位置:第二个输出的ContainerSettings.M3u8Settings.AudioPids

"AudioPids": [483]

4. 优化时间码同步(可选但推荐)

外部音频和原视频的时间码如果没对齐,可能出现音视频不同步或加载失败。确保输入的TimecodeSource统一为ZEROBASED,同时可以在HLS组设置里开启TimecodeBurnin(可选),方便排查同步问题。

5. 清理冗余配置(可选)

如果没有广告需求,把AdMarkers从["ELEMENTAL"]改成空数组,避免干扰清单结构;另外可以开启ManifestCompression减小清单体积,提升加载速度:

"AdMarkers": [],
"ManifestCompression": "GZIP"

修改后的验证

修改后重新提交MediaConvert任务,生成HLS输出后:

  • 检查主播放清单(m3u8)的结构,确认视频流和两个音频流都正确声明
  • 用不同播放器(比如Safari、VLC)测试,验证视频正常显示、备选音轨可以切换

内容的提问来源于stack exchange,提问作者Sandeep Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:24:55