数据流映射

借助 Transcoder API 您可以串联视频、混合音轨,等等。JobConfig JSON 规范非常灵活,这可能会在输入和输出之间产生歧义。您可以定义某些数据流映射来消除此歧义。否则,API 会为您指定合理的默认数据流映射。

本页面介绍了 API 提供的默认数据流映射,以及有关输入媒体文件编码的高级配置示例。

背景

JobConfig 中的 inputs 列表指定要下载哪些文件,而不是如何使用这些文件。每个输入都与一个键配对,以识别该键。

editList 将转码作业的输出文件(或清单)的一系列修改定义为时间轴。editList 中的 inputs 决定在每个 Atom 中使用的输入。

如需了解详情,请参阅“概览”中的概念部分。

默认视频映射

editList 中的每个 Atom 必须至少引用一个包含视频轨道的输入。如果为 Atom 定义了多个输入,并且每个输入都包含一个视频轨道,则 inputs 列表中的第一个输入用作视频源;此为默认映射。如果所有输入都不包含视频轨道,作业将失败。

以下配置将视频轨道 input0.mp4 的前 5 秒与视频轨道 input1.mov 的 10 秒串联到输出文件中:

"inputs": [
  {
    "key": "input0",
    "uri": "gs://my-bucket/input0.mp4"
  },
  {
    "key": "input1",
    "uri": "gs://my-bucket/input1.mov"
  }
],
"editList": [
  {
    "key": "atom0",
    "inputs": ["input0"],
    "endTimeOffset": "5s",
    "startTimeOffset": "0s"
  },
  {
    "key": "atom1",
    "inputs": ["input1"],
    "endTimeOffset": "20s",
    "startTimeOffset": "10s"
  }
]

如需了解详情,请参阅串联多个输入视频

默认音频映射

音频映射适用于各种情况,尤其是在音频输入输出的数量不一致的时候。

串联多个输入

如果定义了 audioStream,则 editList 中的每个 Atom 必须引用至少一个包含音轨的输入。如果为 Atom 定义了多个输入,并且每个输入都包含一个音轨,则 inputs 列表中的第一个输入用作音频源;此为默认映射。如果所有输入都不包含音轨,作业将失败。

如果客户端没有明确指定映射,则 Transcoder API 仅为每个已定义的 audioStream 生成默认映射。

请考虑以下包含已定义 audioStream 的配置:

"inputs": [
  {
    "key": "video_and_stereo_audio",
    "uri": "gs://my-bucket/video_and_stereo_audio.mp4"
  },
  {
    "key": "video_only",
    "uri": "gs://my-bucket/video_only.mov"
  },
  {
    "key": "stereo_audio_only",
    "uri": "gs://my-bucket/stereo_audio_only.mp3"
  }
],
"editList": [
  {
    "key": "atom0",
    "inputs": ["video_and_stereo_audio"]
  },
  {
    "key": "atom1",
    "inputs": ["video_only", "stereo_audio_only"]
  }
],
"elementaryStreams": [
  {
    "key": "output_audio",
    "audioStream": {
      "codec": "aac",
      "bitrateBps": 64000,
      "channelCount": 2, // API default
      "channelLayout": ["fl", "fr"], // API default
      "sampleRateHertz": 48000
    }
  }
]

Transcoder API 为音频输出生成以下默认映射。请注意,audioStream 字段不应用于 video_only 输入。虽然此输入在 inputs 列表中显示为第一个输入,但它并不包含音轨。

"elementaryStreams": [
  {
    "key": "output_audio",
    "audioStream": {
      "codec": "aac",
      "bitrateBps": 64000,
      "channelCount": 2,
      "channelLayout": ["fl", "fr"],
      "sampleRateHertz": 48000,
      "mapping": [
        {
          "atomKey": "atom0",
          "inputKey": "video_and_stereo_audio",
          "inputTrack": 1,
          "inputChannel": 0,
          "outputChannel": 0,
          "gainDb": 0
        },
        {
          "atomKey": "atom0",
          "inputKey": "video_and_stereo_audio",
          "inputTrack": 1,
          "inputChannel": 1,
          "outputChannel": 1,
          "gainDb": 0
        },
        {
          "atomKey": "atom1",
          "inputKey": "stereo_audio_only",
          "inputTrack": 0,
          "inputChannel": 0,
          "outputChannel": 0,
          "gainDb": 0
        },
        {
          "atomKey": "atom1",
          "inputKey": "stereo_audio_only",
          "inputTrack": 0,
          "inputChannel": 1,
          "outputChannel": 1,
          "gainDb": 0
        }
      ]
    }
  }
]

N 到 n 复制

如果输入音频轨道中的通道数与输出 audioStream 中的通道数一致,则 Transcoder API 会将输入通道复制到输出通道中。

请考虑以下配置,它包含一个具有双通道立体声音频的输入和一个具有两个通道的已定义的 audioStream

"inputs": [
  {
    "key": "video_and_stereo_audio",
    "uri": "gs://my-bucket/video_and_stereo_audio.mp4"
  }
],
"editList": [
  {
    "key": "atom0",
    "inputs": ["video_and_stereo_audio"]
  }
],
"elementaryStreams": [
  {
    "key": "output_audio",
    "audioStream": {
      "codec": "aac",
      "bitrateBps": 64000,
      "channelCount": 2, // API default
      "channelLayout": ["fl", "fr"], // API default
      "sampleRateHertz": 48000
    }
  }
]

Transcoder API 为音频输出生成以下默认映射:

"elementaryStreams": [
  {
    "key": "output_audio",
    "audioStream": {
      "codec": "aac",
      "bitrateBps": 64000,
      "channelCount": 2,
      "channelLayout": ["fl", "fr"],
      "sampleRateHertz": 48000,
      "mapping": [
        {
          "atomKey": "atom0",
          "inputKey": "video_and_stereo_audio",
          "inputTrack": 1,
          "inputChannel": 0,
          "outputChannel": 0,
          "gainDb": 0
        },
        {
          "atomKey": "atom0",
          "inputKey": "video_and_stereo_audio",
          "inputTrack": 1,
          "inputChannel": 1,
          "outputChannel": 1,
          "gainDb": 0
        }
      ]
    }
  }
]

N 到 1 缩混

如果输入音轨中的通道数大于输出 audioStream 中的通道数,则 Transcoder API 会将所有输入通道复制到单个输出通道中。

如果 audioStream 定义了多个输出通道,则系统会复制该单个输出通道并将其用于每个输出通道。例如,如果输入音轨包含 5 个通道,并且 audioStream 定义了两个输出通道,则这两个输出通道将包含完全相同的音频,即 5 个输入通道的缩混。

请考虑以下配置,它包含一个具有双通道立体声音频的输入和一个具有一个输出通道的已定义的 audioStream

"inputs": [
  {
    "key": "video_and_stereo_audio",
    "uri": "gs://my-bucket/video_and_stereo_audio.mp4"
  }
],
"editList": [
  {
    "key": "atom0",
    "inputs": ["video_and_stereo_audio"]
  }
],
"elementaryStreams": [
  {
    "key": "output_audio",
    "audioStream": {
      "codec": "aac",
      "bitrateBps": 64000,
      "channelCount": 1,
      "channelLayout": ["fc"],
      "sampleRateHertz": 48000
    }
  }
]

Transcoder API 为音频输出生成以下默认映射:

"elementaryStreams": [
  {
    "key": "output_mono_audio",
    "audioStream": {
      "codec": "aac",
      "bitrateBps": 64000,
      "channelCount": 1,
      "channelLayout": ["fc"],
      "sampleRateHertz": 48000,
      "mapping": [
        {
          "atomKey": "atom0",
          "inputKey": "video_and_stereo_audio",
          "inputTrack": 1,
          "inputChannel": 0,
          "outputChannel": 0,
          "gainDb": 0
        },
        {
          "atomKey": "atom0",
          "inputKey": "video_and_stereo_audio",
          "inputTrack": 1,
          "inputChannel": 1,
          "outputChannel": 0,
          "gainDb": 0
        }
      ]
    }
  }
]

1 到 N 复制

如果输入音频轨道中的通道数小于输出 audioStream 中的通道数,则 Transcoder API 会将第一个输入通道复制到每个输出通道中。

请考虑以下配置,它包含一个具有一通道单声道音频的输入和一个具有两个输出通道的已定义的 audioStream

"inputs": [
  {
    "key": "video_and_mono_audio",
    "uri": "gs://my-bucket/video_and_mono_audio.mp4"
  }
],
"editList": [
  {
    "key": "atom0",
    "inputs": ["video_and_mono_audio"]
  }
],
"elementaryStreams": [
  {
    "key": "output_mono_audio",
    "audioStream": {
      "codec": "aac",
      "bitrateBps": 64000,
      "channelCount": 2, // API default
      "channelLayout": ["fl", "fr"], // API default
      "sampleRateHertz": 48000
    }
  }
]

Transcoder API 为音频输出生成以下默认映射:

"elementaryStreams": [
  {
    "key": "output_mono_audio",
    "audioStream": {
      "codec": "aac",
      "bitrateBps": 64000,
      "channelCount": 2,
      "channelLayout": ["fl", "fr"],
      "sampleRateHertz": 48000,
      "mapping": [
        {
          "atomKey": "atom0",
          "inputKey": "video_and_mono_audio",
          "inputTrack": 1,
          "inputChannel": 0,
          "outputChannel": 0,
          "gainDb": 0
        },
        {
          "atomKey": "atom0",
          "inputKey": "video_and_mono_audio",
          "inputTrack": 1,
          "inputChannel": 0,
          "outputChannel": 1,
          "gainDb": 0
        }
      ]
    }
  }
]

默认文本映射

文本映射通常用于字幕 (CC)。

如果定义了 textStream,则 editList 中的每个 Atom 必须引用至少一个包含文本轨道的输入。如果为 Atom 定义了多个输入,并且每个输入都包含一个文本轨道,则 inputs 列表中的第一个输入用作文本源;此为默认映射。如果输入不包含任何输入,则作业将失败。

"inputs": [
  {
    "key": "video_and_audio",
    "uri": "gs://my-bucket/video_and_audio.mp4"
  },
  {
    "key": "sub",
    "uri": "gs://my-bucket/sub.srt"
  }
],
"editList": [
  {
    "key": "atom0",
    "inputs": ["video_and_audio", "sub"]
  }
],
"elementaryStreams": [
  {
    "key": "output_sub",
    "textStream": {
      "codec": "webvtt"
    }
  }
]

Transcoder API 为文本输出生成以下默认映射:

"elementaryStreams": [
  {
    "key": "output_sub",
    "textStream": {
      "codec": "webvtt",
      "mapping": [
        {
          "atomKey": "atom0",
          "inputKey": "caption_input0",
          "inputTrack": 0
        }
      ]
    }
  }
]