Mapeamentos de stream

Com a API Transcoder, é possível concatenar vídeos, mixar faixas de áudio e muito mais. A especificação JSON JobConfig é altamente flexível e isso pode criar ambiguidade entre as entradas e saídas. Você pode definir certos mapeamentos de stream para limpar essa ambiguidade. Se não fizer isso, a API fornecerá mapeamentos de stream padrão razoáveis para você.

Esta página mostra os mapeamentos de stream padrão fornecidos pela API e alguns exemplos de configuração avançada para a codificação de arquivos de mídia de entrada.

Contexto

A lista inputs em um JobConfig especifica quais arquivos serão transferidos por download, não como usá-los. Cada entrada é pareada com uma chave para identificá-la.

O editList define uma sequência de edições como uma linha do tempo do arquivo de saída (ou manifesto) a partir de um job de transcodificação. As inputs em editList determinam quais entradas serão usadas em cada atom.

Para mais informações, leia a seção Conceitos e terminologia na visão geral.

Mapeamento de vídeo padrão

Cada atom em editList precisa referenciar pelo menos uma entrada que contenha uma faixa de vídeo. Se várias entradas forem definidas para um atom e cada uma contiver uma faixa de vídeo, a primeira entrada na lista inputs será usada como a origem do vídeo. Esse é o mapeamento padrão. Se nenhuma das entradas tiver uma faixa de vídeo, o job falhará.

A configuração a seguir concatena os primeiros 5 segundos da faixa de vídeo input0.mp4 com 10 segundos da faixa de vídeo input1.mov no arquivo de saída:

"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"
  }
]

Mapeamentos de áudio padrão

Os mapeamentos de áudio se aplicam a várias situações, principalmente quando há um número incompatível de entradas de áudio nas saídas.

Concatenar várias entradas

Cada atom em editList precisará referenciar pelo menos uma entrada que contenha uma faixa de áudio se audioStream for definido. Se várias entradas forem definidas para um atom e cada uma contiver uma faixa de áudio, a primeira entrada na lista inputs será usada como a origem do áudio. Esse é o mapeamento padrão. Se nenhuma das entradas tiver uma faixa de áudio, o job falhará.

A API Transcoder gera apenas um mapeamento padrão para cada audioStream definido se o mapeamento não for especificado explicitamente pelo cliente.

Considere a seguinte configuração que contém um audioStream definido:

"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
    }
  }
]

A API Transcoder gera os seguintes mapeamentos padrão para saída de áudio. Observe que os campos audioStream não são aplicados à entrada video_only. Embora essa entrada apareça primeiro na lista inputs, ela não contém uma faixa de áudio.

"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
        }
      ]
    }
  }
]

Copiar N para n

Se o número de canais na faixa de áudio de entrada corresponder ao número de canais na saída audioStream, a API Transcoder copiará os canais de entrada para os canais de saída.

Considere a seguinte configuração que contém uma entrada com áudio estéreo de dois canais e um audioStream definido com dois canais:

"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
    }
  }
]

A API Transcoder gera os seguintes mapeamentos padrão para saída de áudio:

"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 para 1 downmix

Se o número de canais na faixa de áudio de entrada for maior que o número de canais na saída audioStream, a API Transcoder copiará todos os canais de entrada em um único canal de saída.

Se audioStream definir vários canais de saída, o único canal de saída será copiado e usado para cada canal de saída. Por exemplo, se a faixa de áudio de entrada consistir em cinco canais e audioStream definir dois canais de saída, esses dois canais de saída terão exatamente o mesmo áudio, um downmix dos cinco canais de entrada.

Considere a seguinte configuração que contém uma entrada com áudio estéreo de dois canais e um audioStream definido com um canal de saída:

"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
    }
  }
]

A API Transcoder gera os seguintes mapeamentos padrão para saída de áudio:

"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
        }
      ]
    }
  }
]

Cópia de 1 a N

Se o número de canais na faixa de áudio de entrada for menor que o número de canais na saída audioStream, a API Transcoder copiará o primeiro canal de entrada em cada canal de saída.

Considere a seguinte configuração que contém uma entrada com áudio mono de um canal e um audioStream definido com dois canais de saída:

"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
    }
  }
]

A API Transcoder gera os seguintes mapeamentos padrão para saída de áudio:

"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
        }
      ]
    }
  }
]

Mapeamento de texto padrão

Os mapeamentos de texto geralmente são usados para legendas e closed captioning (CC, na sigla em inglês).

Cada atom em editList precisará referenciar pelo menos uma entrada que contenha uma faixa de texto se um textStream for definido. Se várias entradas forem definidas para um atom e cada uma contiver uma faixa de texto, a primeira entrada na lista inputs será usada como a origem do texto. Esse é o mapeamento padrão. Se nenhuma das entradas tiver uma faixa de texto, o job falhará.

"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"
    }
  }
]

A API Transcoder gera os seguintes mapeamentos padrão para saída de texto:

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