Skip to content

Transcodificação

O transcodificador do Sapsan (baseado em FFmpeg) recodifica o stream de entrada: muda codecs, taxa de bits e resolução, e prepara uma escada de qualidades multibitrate (MBR) a partir de uma única fonte.

Configuração

A seção transcoder.output descreve as trilhas de saída. Cada trilha toma uma fonte (!content video ou !content audio) e define um codec:

streams:
  - name: tv1
    inputs:
    - udp: {host: 239.0.0.1, port: 5000}
    transcoder:
      output:
      - source: !content video          # 1080p — o topo da escada
        codec: !set h264
        bitrate: 2800000
        params: !video
          gop_size: 28
          gop_structure: ibbbp
      - source: !content video          # 720p
        codec: !set h264
        bitrate: 1200000
        params: !video
          gop_size: 28
          gop_structure: ibbbp
          resize: !fit
            height: 720
      - source: !content audio
        codec: !set aac

Seleção da trilha de origem

source O que toma
!content video / !content audio uma trilha por tipo de conteúdo
!exact v1 uma trilha específica por identificador
!best_quality video a melhor qualidade disponível
!language_codec [eng, aac] uma trilha por idioma e codec

O parâmetro if_missing define o comportamento quando a trilha não existe: drop (padrão — a saída não é criada), blank (sinal vazio) ou substitute.

Codecs e parâmetros

  • codec: !set <name> — recodificar (h264, hevc, av1, aac, opus); codec: same — passar sem recodificar (por exemplo, apenas reempacotar o áudio).
  • Saídas de codecs diferentes a partir de uma mesma fonte mantêm alinhados os timestamps e os quadros-chave — uma escada h264/hevc/av1 permanece consistente.
  • gop_size, gop_structure (ip, ibp, ibbp, ibbbp, ibbbbp) — controle da estrutura do GOP, importante para segmentos MBR alinhados.
  • Áudio: recodificação G.711 → AAC/Opus 48 kHz com preservação da linha do tempo — o caso típico de câmera IP.
  • As trilhas JPEG de capturas atravessam o transcodificador intactas.

Redimensionamento

resize O que faz
!scale escala exata para as dimensões indicadas
!fit encaixar preservando a proporção de aspecto (com preenchimento, cor de fundo configurável)
!crop recortar para as dimensões indicadas

O transcodificador sobrepõe uma imagem de logotipo ao vídeo — o logotipo do canal no canto do quadro ou uma marca d'água. O logotipo fica «gravado» na trilha de vídeo: aparece em qualquer dispositivo e vai para o arquivo. A seção logo vive nos parâmetros de vídeo do degrau e é aplicada ao quadro pronto de cada degrau separadamente — depois do escalonamento e das bordas do fit —, então o tamanho em pixels da imagem não depende da resolução de saída.

streams:
  - name: tv1
    inputs:
    - udp: {host: 239.0.0.1, port: 5000}
    transcoder:
      output:
      - source: !content video          # 1080p — o topo da escada
        codec: !set h264
        bitrate: 2800000
        params: !video
          logo:
            image: /storage/logo.png
            position: top_right
            x: 24
            y: 16
            height: 72
      - source: !content video          # 720p
        codec: !set h264
        bitrate: 1200000
        params: !video
          resize: !fit
            height: 720
          logo:
            image: /storage/logo.png
            position: top_right
            x: 16
            y: 10
            height: 48
Campo O que define
image o endereço da imagem: um caminho no nó, uma URL http(s) ou uma referência a um registro da biblioteca de logotipos logo@<sha256>
position o ponto de ancoragem no quadro — um dos cinco, obrigatório
x, y deslocamentos em pixels a partir da ancoragem, 0 por padrão
width, height o tamanho da imagem em pixels do quadro do degrau

As ancoragens são top_left, top_right, bottom_left, bottom_right e center. Os deslocamentos são contados da ancoragem para dentro: nos cantos, do canto correspondente; em center, um deslocamento a partir do centro.

O tamanho é dado em pixels do quadro do degrau. Com os dois campos — a imagem é ajustada a eles; com um — o outro é derivado da proporção da imagem, sem distorção; com nenhum — a imagem é usada no tamanho nativo. Para o logotipo ocupar a mesma fração do quadro em toda a escada, os tamanhos dos degraus são calculados pela altura: no exemplo acima, 72 px em 1080p e 48 px em 720p são a mesma fração do quadro. Os degraus sem a seção logo ficam como estavam.

Requisitos da imagem:

  • Formato — PNG ou JPEG pela assinatura dos bytes. Um PNG com canal alfa mantém a transparência: os pixels transparentes não tocam o quadro e os semitransparentes se misturam com ele.
  • Limites — no máximo 1 MB de bytes e 4096 pixels por lado.
  • A URL é baixada ao configurar o degrau, com timeout de 10 segundos.
  • A mesma imagem em vários degraus é carregada e decodificada uma única vez.

Restrições:

  • O logotipo é sobreposto apenas numa saída com codificação: um degrau com codec: same e os codecs de transmissão brutos (j2k, v210, uyvy422) não o suportam — essa seção é rejeitada na gravação.
  • width e height são inteiros positivos não maiores que 4096; o zero e o que passa do limite são rejeitados na gravação, indicando o campo.
  • A imagem é lida ao montar o degrau, não em cada quadro: mudar o endereço, a ancoragem ou os deslocamentos é uma edição comum da configuração — o degrau é remontado e o stream continua.

Um logotipo quebrado é um erro do degrau

Se a imagem não puder ser carregada ou decodificada — não há arquivo, a URL não responde, o limite é excedido, os bytes não se leem —, o degrau não é montado: no estado da saída e no log aparece um erro com nome, enquanto os demais degraus e o próprio stream continuam funcionando. O transcodificador nunca servirá o stream sem o logotipo em silêncio. A recuperação é editar o endereço da imagem: a nova configuração remonta o degrau sem reiniciar o processo.

A referência logo@<sha256> aponta para um registro da biblioteca de logotipos do central: o nó baixa a imagem ao aplicar o corte de configuração e entrega ao transcodificador um arquivo pronto. Num nó isolado (sem central) essa referência dá um erro de degrau com nome — ali funcionam o caminho no nó e a URL http(s). No console do Catena o logotipo da escada é definido com o cartão Logotipo da escada (Transcodificação e MBR).

Note

TODO: aceleração por hardware (Nvenc/Vulkan), desentrelaçamento, referência de parâmetros de áudio.

Verificação

Abra a playlist mestra http://server/streaming/v/tv1/index.m3u8 — nela devem aparecer todas as qualidades de saída.

Próximos passos