# MediaLive sem timecode: o que o Video Aligned Locking muda na redundância

O MediaLive passou a sincronizar pipelines por assinatura visual dos frames, sem depender de timecode embutido — exatamente a peça que faltava para fontes SRT/RTMP de campo e para canais single-pipeline ligados entre regiões. Disseco o padrão: o problema que ele resolve, a anatomia dos modos e métodos de locking, as regras de frame rate e de input que derrubam a sincronização em silêncio, e as três métricas que precisam de alarme antes de ir para produção.

- URL: https://fernando.moretes.com/blog/medialive-sem-timecode-o-que-o-video-aligned-locking-muda-na-redundanc-aws-elementa

- Markdown: https://fernando.moretes.com/blog/medialive-sem-timecode-o-que-o-video-aligned-locking-muda-na-redundanc-aws-elementa/article.md?lang=pt

- Published: 2026-09-13T10:14:40.690Z

- Category: IA & Agentes

- Tags: MediaLive, live-streaming, pipeline-locking, multi-region, resilience, observability, media-services, SRT

- Reading time: 7 min

- Source: [AWS Elemental MediaLive enables frame-accurate pipeline locking for streams without timecode](https://aws.amazon.com/about-aws/whats-new/2026/09/medialive-pipeline-locking/)

---

Todo desenho de streaming ao vivo com redundância promete a mesma coisa: se o pipeline A cair, o player continua no B sem que o espectador perceba. O que quase ninguém escreve no ADR é a condição para essa promessa valer — os dois pipelines precisam estar no mesmo frame, no mesmo instante, com os mesmos limites de segmento. Durante anos isso exigiu timecode embutido na fonte, e timecode é coisa de caminhão de externa, não de encoder SRT num estádio ou de um push RTMP saindo de um estúdio pequeno. O Video Aligned Locking do AWS Elemental MediaLive, anunciado em 12 de setembro de 2026, tira essa dependência: o encoder compara assinaturas visuais dos frames entre os pipelines e alinha por conteúdo. Vale entender o que ele resolve, o que ele não resolve e onde ele falha sem avisar.

## O problema: redundância que só funciona no slide

Um canal `STANDARD` do MediaLive roda dois pipelines em Availability Zones diferentes. O sistema upstream manda o mesmo sinal para as duas entradas, o MediaLive processa em paralelo e cada output group entrega duas cópias — uma por pipeline — para o downstream (MediaPackage, um origin próprio, um CDN). A redundância está no downstream escolher qualquer uma das duas a qualquer momento.

**O que quebra:** dois encoders independentes não começam no mesmo frame. Cada um recebe o sinal com jitter próprio, começa a codificar num instante próprio e corta segmentos em pontos próprios. Sem sincronização, o segmento 1042 do pipeline 0 e o segmento 1042 do pipeline 1 têm conteúdos diferentes — deslocados por algumas dezenas de frames. Quando o origin troca de pipeline, o player vê um salto para frente ou uma repetição. Em esporte, isso é o gol que o espectador viu duas vezes.

**A resposta histórica:** timecode embutido (SMPTE 12M, VITC, ancillary data). Com timecode, os dois encoders sabem que "este frame é 14:32:07:12" e cortam no mesmo ponto. É o método `SOURCE_TIMECODE`, padrão do MediaLive até hoje. Funciona bem em broadcast tradicional, onde a cadeia inteira carrega timecode desde a câmera.

**Onde a resposta histórica não chega:** a maioria dos fluxos digitais que vi passar por SRT, RTMP push ou contribuição por IP simplesmente não carrega timecode — ou carrega um que reinicia, salta ou vem de dois encoders com relógio diferente. Nesses casos, o MediaLive cai para sincronização aproximada, o que na prática significa "não confie no failover". A alternativa era hardware especializado antes do encoder, ou orquestração externa. Custo de manter isso por anos, não de comprar: mais um ponto de falha e mais um plantão.

## Anatomia: modos, métodos e o pool de locking

O pipeline locking vive em `encoderSettings.globalConfiguration` e tem duas camadas que a documentação separa com cuidado.

**Modo (`outputLockingMode`):** `DISABLED`, `PIPELINE_LOCKING` (os pipelines travam um no outro) ou `EPOCH_LOCKING` (os dois travam no Unix epoch — ou num `CustomEpoch` a partir de `2000-01-01T00:00:00`, só para CMAF Ingest e MediaPackage V2). O padrão num canal standard é `PIPELINE_LOCKING`, e ele é best-effort: quando não consegue travar, o MediaLive continua processando e não trata isso como falha. Esse detalhe importa mais do que parece — nada para, nada alarma, o failover só deixa de ser frame-accurate.

**Método (`outputLockingSettings.pipelineLockingSettings.pipelineLockingMethod`):** só existe dentro de `PIPELINE_LOCKING`. `SOURCE_TIMECODE` usa o timecode embutido; `VIDEO_ALIGNMENT` calcula uma assinatura visual por frame em cada encoder e alinha os frames cujo conteúdo bate. Com `VIDEO_ALIGNMENT`, o timecode existente é ignorado para qualquer decisão de locking — não é fallback, é substituição.

**O pool:** os pipelines participantes formam um pool de locking com um pipeline de referência. A métrica `InputVideoAligned` da referência é sempre 1; os demais só marcam 1 quando alinharam com ela. Um canal standard tem os dois pipelines no pool. Um canal `SINGLE_PIPELINE` entra no pool via **linked channels**: um canal primary é o dono do grupo, um follower aponta para o ARN do primary — mesma conta, um follower por primary, e o primary não precisa estar rodando para o follower funcionar. É isso que permite dois single-pipeline em regiões diferentes se comportarem como um standard de duas AZs.

**Um detalhe de linha do tempo:** o campo `VIDEO_ALIGNMENT` já aparecia no SDK em 26 de dezembro de 2025; o What's New é de setembro de 2026. Se sua IaC já expõe o campo, não é acidente.

## Video Aligned Locking: dois pipelines, um follower cross-region, um pool

O mesmo sinal sem timecode chega a três encoders; o pool compara assinaturas visuais, alinha o corte de segmento e expõe o estado em duas métricas. O downstream troca de cópia sem salto.

### 🟧 AWS us-east-1 — canal STANDARD

- Pipeline 0 · AZ-a referência do pool (compute)
- Pipeline 1 · AZ-b segue a referência (compute)

### 🟧 AWS us-west-2 — SINGLE_PIPELINE linked

- Follower channel aponta para o ARN do primary (compute)

### 🔧 Pool de locking — VIDEO_ALIGNMENT

- Assinatura visual por frame, por encoder (ai)
- Comparação de frames alinha corte de segmento (security)
- CloudWatch PipelinesLocked · InputVideoAligned (network)

### 📤 Distribuição

- MediaPackage / CMAF Ingest segmentos idênticos por pipeline (storage)
- CDN → player failover sem salto (edge)

### Fluxos

- src -> p0: entrada A
- src -> p1: entrada B (mesmo conteúdo)
- src -> fol: contribuição cross-region
- p0 -> sig: frames
- p1 -> sig: frames
- fol -> sig: frames (mesmo pool)
- sig -> cmp: frame N ↔ frame N
- cmp -> p1: ajusta offset
- cmp -> fol: ajusta offset
- cmp -> cw: 1 travado / 0 open loop
- p0 -> mp: cópia 0
- p1 -> mp: cópia 1
- fol -> mp: cópia regional
- mp -> cdn: troca de cópia no mesmo frame

## Quando usar — e as regras que derrubam o lock em silêncio

Use `VIDEO_ALIGNMENT` quando: a fonte é SRT, RTMP push, RTP ou um Elemental Link sem timecode confiável; os dois pipelines recebem exatamente o mesmo conteúdo; e o que você quer é failover entre cópias ou troca de input frame-accurate. Use `SOURCE_TIMECODE` quando a cadeia já carrega timecode limpo desde a câmera — ele continua sendo o método com mais histórico em produção e o único que cobre Microsoft Smooth. Use `EPOCH_LOCKING` quando precisa que canais **sem relação entre si** produzam segmentos com os mesmos limites de tempo absoluto; ele exige timecode embutido dentro de 2 minutos do epoch e não combina com `VIDEO_ALIGNMENT`.

Agora as regras que ninguém lê e que custam uma madrugada:

**Inputs incompatíveis não geram erro de validação.** `MP4_FILE`, `TS_FILE`, `URL_PULL` com HLS e `RTMP_PULL` fazem o video alignment rodar em open loop — processando, mas sem travar. O canal salva, sobe e reporta `InputVideoAligned = 0`. Isso é deliberado, para permitir input switching com fontes mistas; também é a armadilha mais comum.

**Input HLS mata o locking do canal inteiro.** Se o canal contém um input HLS, o MediaLive para de tentar travar e **não retoma** nem depois de trocar para outro input. Um slate HLS "de emergência" na lista de inputs anula a redundância que você desenhou.

**Frame rate precisa de conversão simples.** Entrada e saída devem ser múltiplos inteiros uma da outra: 29.97 → 59.94 funciona; 59.94 → 60 não; 45 → 60 não. O MediaLive decide na troca de input e não reavalia se o frame rate mudar no meio. `ComplexFRCPresent = 1` é o sinal. E `Framerate control` precisa ser `Specified`, nunca `Initialize_from_source`.

**Conteúdo que faz loop confunde a assinatura.** Um slate de 10 segundos repetido tem frames idênticos em posições diferentes; o comparador pode alinhar no frame errado ou oscilar. A documentação lista isso como causa de `InputVideoAligned` alternando entre 0 e 1.

## Três formas de travar pipelines no MediaLive
| Critério | Configuração | Exige timecode? | Outputs cobertos | Quando escolher |
| --- | --- | --- | --- | --- |
| PIPELINE_LOCKING + SOURCE_TIMECODE (padrão) | `outputLockingMode: PIPELINE_LOCKING`, método padrão | Recomendado; sem ele cai para sincronização aproximada | HLS live, MediaPackage, CMAF Ingest, UDP/SRT segmentado, Microsoft Smooth | Cadeia broadcast com timecode limpo desde a origem |
| PIPELINE_LOCKING + VIDEO_ALIGNMENT | `pipelineLockingSettings.pipelineLockingMethod: VIDEO_ALIGNMENT` | Não; timecode existente é ignorado | HLS live, MediaPackage, CMAF Ingest, UDP/SRT segmentado (sem Smooth) | SRT/RTMP push sem timecode; linked channels cross-region; inputs sem file/HLS/RTMP_PULL |
| EPOCH_LOCKING | `outputLockingMode: EPOCH_LOCKING`, opcional `CustomEpoch` | Sim, dentro de 2 minutos do epoch | Os mesmos, mas desliga SCTE-35 passthrough e manifest decoration em HLS/MediaPackage | Canais independentes que precisam de limites de segmento em tempo absoluto |

## Operar isso: métricas, alarmes e o custo real

O locking é best-effort e silencioso, então a observabilidade não é opcional — é a única forma de saber se a redundância que você pagou existe agora.

**Três métricas, dimensões `ChannelId` e `Pipeline`, estatística `Minimum`:**

- `PipelinesLocked`: 1 quando todos os pares elegíveis estão sincronizados; 0 quando pelo menos um não está. Vale para standard, epoch e linked channels, e reporta o mesmo estado com `VIDEO_ALIGNMENT`. Sem datapoints significa canal parado.
- `InputVideoAligned`: 1 quando o pipeline alinhou com a referência do pool. A referência marca 1 sempre. Sem datapoints significa que o método não é `VIDEO_ALIGNMENT` ou o pipeline ainda não processou frame algum.
- `ComplexFRCPresent`: 1 significa conversão complexa de frame rate e nenhuma tentativa de locking.

Meu alarme mínimo: `PipelinesLocked` com `Minimum < 1` por 3 períodos de 1 minuto num canal que deveria estar travado, e `InputVideoAligned` transitando mais de N vezes em 5 minutos — oscilação é sintoma de rede instável entre os dois caminhos de contribuição ou de conteúdo em loop, e os dois exigem ação humana. Sem esses alarmes, a primeira notícia de que o lock caiu chega pelo espectador que viu o replay duplicado.

**Custo:** o MediaLive cobra por hora de input, output e add-on, arredondado ao minuto acima de um mínimo de 10 minutos. Um output 1080p AVC 5 Mbps 30 fps custa US$ 0,702/h on-demand em `us-east-1`; reservado por 12 meses cai para cerca de US$ 0,1726/h. Um canal standard custa menos que dois single-pipeline idênticos na mesma região — então o desenho de dois single-pipeline ligados só se justifica quando você precisa de duas **regiões**, não de duas AZs. O locking em si não tem linha própria na fatura; o que ele custa é o segundo caminho de contribuição até a outra região.

## Anti-padrões que vi em desenhos de redundância ao vivo

- **Slate HLS na lista de inputs**: um input HLS de emergência faz o MediaLive parar de travar o canal inteiro e não retomar — a redundância morre no dia em que ninguém está olhando.
- **Confiar no save do canal como validação**: `RTMP_PULL` e file inputs passam sem erro e rodam em open loop; só `InputVideoAligned` conta a verdade.
- **`Initialize_from_source` no frame rate de saída**: a documentação diz que não funciona bem com locking; `Specified` com numerador/denominador explícitos é o único caminho previsível.
- **Dois single-pipeline na mesma região para "ter controle"**: custa mais que um standard e não ganha nada em zona — linked channels são para cross-region.
- **Epoch locking com SCTE-35 em HLS/MediaPackage**: o canal desliga passthrough e manifest decoration; a inserção de anúncio some sem que o time de ads saiba por quê.
- **Caminhos de contribuição assimétricos**: mandar o sinal para a segunda região por uma rota com jitter muito diferente faz a assinatura oscilar; o lock vira intermitente, o pior estado possível.

> **Teste de aceitação antes do primeiro evento:** Suba o canal com o input real, espere `InputVideoAligned = 1` nos dois pipelines, e então force a troca de cópia no origin — no MediaPackage, alternando o endpoint de ingest ativo — enquanto grava a saída com um relógio de burn-in visível no vídeo. Se o relógio salta ou repete um frame, o lock não está fazendo o que o ADR promete. Repita com o input de backup ativo. Vinte minutos de teste valem mais que qualquer diagrama.

> **Nota de curadoria:** Eu trocaria para `VIDEO_ALIGNMENT` em qualquer canal cuja fonte seja SRT ou RTMP push de campo, e deixaria `SOURCE_TIMECODE` só onde a cadeia inteira é broadcast com timecode auditado. Antes de trocar, eu removeria todo input HLS e `RTMP_PULL` do canal e colocaria alarme em `PipelinesLocked` e `InputVideoAligned` no mesmo commit da mudança — não na semana seguinte. A lição dura por trás disso: em sistema best-effort, a ausência de erro não é prova de funcionamento; a única prova é a métrica em 1 no momento em que você força a falha. Já vi redundância desenhada, paga e apresentada em comitê que nunca esteve travada um único minuto — e ninguém soube até o evento.

## Veredito

Video Aligned Locking é a peça que faltava para tratar fontes digitais sem timecode com a mesma seriedade que o broadcast tratava as suas — e a combinação com linked channels torna viável um canal ativo-ativo em duas regiões sem hardware na frente do encoder. Adote quando: a fonte não tem timecode confiável, os dois caminhos de contribuição entregam o mesmo conteúdo com jitter comparável, os inputs são todos compatíveis e o frame rate de saída é múltiplo inteiro do de entrada. Fique no `SOURCE_TIMECODE` quando a cadeia já carrega timecode limpo ou quando precisa de Microsoft Smooth. Em qualquer dos casos, o que decide se a redundância existe não é a configuração — é o alarme em `PipelinesLocked` que você vai ou não vai criar.

**Rating:** Adote com alarmes / Adopt with alarms

## Referências

- [AWS What's New — MediaLive enables frame-accurate pipeline locking for streams without timecode (2026-09-12)](https://aws.amazon.com/about-aws/whats-new/2026/09/medialive-pipeline-locking/)
- [MediaLive User Guide — Implementing pipeline locking (modes, methods, applicable outputs)](https://docs.aws.amazon.com/medialive/latest/ug/pipeline-lock.html)
- [MediaLive User Guide — Input and output requirements, incl. requirements for video aligned locking](https://docs.aws.amazon.com/medialive/latest/ug/pipeline-locking-verify-input.html)
- [MediaLive User Guide — Setting up for locking (console fields, framerate control)](https://docs.aws.amazon.com/medialive/latest/ug/pipeline-locking-set-up.html)
- [MediaLive User Guide — Pipeline locking troubleshooting (ComplexFRCPresent, InputVideoAligned)](https://docs.aws.amazon.com/medialive/latest/ug/pipeline-locking-tshoot.html)
- [MediaLive User Guide — Pipeline locking metrics (PipelinesLocked, InputVideoAligned)](https://docs.aws.amazon.com/medialive/latest/ug/eml-metrics-output-lock.html)
- [MediaLive User Guide — Channel class and linked channels for single-pipeline channels](https://docs.aws.amazon.com/medialive/latest/ug/channel-class.html)
- [CloudFormation — AWS::MediaLive::Channel PipelineLockingSettings (CustomEpoch, PipelineLockingMethod)](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-medialive-channel-pipelinelockingsettings.html)
