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