Visualizar fluxos de entrada quase em tempo real

Nesta página, descrevemos como visualizar seus fluxos de entrada com latência muito baixa para detectar possíveis problemas ou eventos quase em tempo real. Assim, você pode tomar medidas corretivas, como pausar transmissões, inserir anúncios ou mostrar quadros, para manter uma experiência de visualização de alta qualidade para os espectadores.

O conteúdo de prévia está disponível no seguinte formato:

  • Formato: MPEG-TS
  • Vídeo:
    • Resolução: 640 x 480
    • Codec: H.264
    • Frame rate: 25 quadros por segundo (QPS)
  • Áudio
    • Codec: AAC
    • Taxa de amostragem: 48 kHz
    • Protocolo: HTTPS

Antes de começar

Esta página pressupõe que você concluiu as etapas na seção Antes de começar do Guia de início rápido para uma transmissão ao vivo HLS.

Criar um endpoint de entrada

Para criar um endpoint de entrada, use o método projects.locations.inputs.create.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_NUMBER: o número do seu projeto Google Cloud , que está localizado no campo Número do projeto na página Configurações do IAM
  • LOCATION: o local em que o endpoint de entrada será criado. Use uma das regiões compatíveis.
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: um identificador definido pelo usuário para o novo endpoint de entrada a ser criado (para onde você envia seu stream de entrada). Esse valor precisa ter de 1 a 63 caracteres, começar e terminar com [a-z0-9] e pode conter traços (-) entre os caracteres. Por exemplo, my-input.

Corpo JSON da solicitação:

{
  "type": "RTMP_PUSH"
}

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Esse comando cria uma operação de longa duração (LRO) que pode ser usada para acompanhar o progresso da sua solicitação. Consulte Gerenciar operações de longa duração para mais informações.

Receber detalhes do endpoint de entrada

Para receber os detalhes do endpoint de entrada, use o método projects.locations.inputs.get.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_NUMBER: o número do seu projeto Google Cloud , que está localizado no campo Número do projeto na página Configurações do IAM
  • LOCATION: o local em que o endpoint de entrada está localizado. Use uma das regiões compatíveis.
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: o identificador definido pelo usuário para o endpoint de entrada

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
  "createTime": CREATE_TIME,
  "updateTime": UPDATE_TIME,
  "type": "RTMP_PUSH",
  "uri":  "INPUT_STREAM_URI", # For example, "rtmp://1.2.3.4/live/b8ebdd94-c8d9-4d88-a16e-b963c43a953b",
  "tier": "HD"
}

Encontre o campo uri e copie o INPUT_STREAM_URI retornado para usar mais tarde na seção Enviar o fluxo de entrada.

Criar um canal

Para criar um canal, use o método projects.locations.channels.create. Os exemplos a seguir criam um canal que gera uma transmissão ao vivo HLS. A transmissão ao vivo consiste em uma única versão em alta definição (1280 x 720).

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_NUMBER: o número do seu projeto Google Cloud , que está localizado no campo Número do projeto na página Configurações do IAM
  • LOCATION: o local em que o canal será criado. Use uma das regiões compatíveis.
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: um identificador definido pelo usuário para o canal a ser criado. Esse valor precisa ter de 1 a 63 caracteres, começar e terminar com [a-z0-9] e pode conter traços (-) entre os caracteres.
  • INPUT_ID: o identificador definido pelo usuário para o endpoint de entrada
  • BUCKET_NAME: o nome do bucket do Cloud Storage criado para armazenar o manifesto e os arquivos de segmento da transmissão ao vivo.

Corpo JSON da solicitação:

{
  "inputAttachments": [
    {
      "key": "my-input",
      "input": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID"
    }
  ],
  "output": {
    "uri": "gs://BUCKET_NAME"
  },
  "elementaryStreams": [
    {
      "key": "es_video",
      "videoStream": {
        "h264": {
          "profile": "high",
          "widthPixels": 1280,
          "heightPixels": 720,
          "bitrateBps": 3000000,
          "frameRate": 30
        }
      }
    },
    {
      "key": "es_audio",
      "audioStream": {
        "codec": "aac",
        "channelCount": 2,
        "bitrateBps": 160000
      }
    }
  ],
  "muxStreams": [
    {
      "key": "mux_video_ts",
      "container": "ts",
      "elementaryStreams": ["es_video", "es_audio"],
      "segmentSettings": { "segmentDuration": "2s" }
    }
  ],
  "manifests": [
    {
      "key": "manifest_hls",
      "fileName": "main.m3u8",
      "type": "HLS",
      "muxStreams": [
        "mux_video_ts"
      ],
      "maxSegmentCount": 5
    }
  ]
}

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Esse comando cria uma operação de longa duração (LRO) que pode ser usada para acompanhar o progresso da sua solicitação. Consulte Gerenciar operações de longa duração para mais informações.

Iniciar o canal

Para iniciar um canal, use o método projects.locations.channels.start.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_NUMBER: o número do seu projeto Google Cloud , que está localizado no campo Número do projeto na página Configurações do IAM
  • LOCATION: o local em que seu canal está localizado. Use uma das regiões compatíveis
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: um identificador definido pelo usuário para o canal

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "start",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Esse comando cria uma operação de longa duração (LRO) que pode ser usada para acompanhar o progresso da sua solicitação. Consulte Gerenciar operações de longa duração para mais informações.

Instalar um codificador

Para usar a API, você precisa de um codificador para gerar streams de entrada que a API processe.

Instale o ffmpeg, já que esta página explica como usar o ffmpeg para gerar streams de entrada. É possível instalar no Cloud Shell usando o seguinte comando.

sudo apt install ffmpeg

Enviar o stream de entrada

Abra uma nova janela do terminal. Execute o comando a seguir usando INPUT_STREAM_URI da seção Receber detalhes do endpoint de entrada. Esse comando gera um fluxo de teste.

ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
  -acodec aac -vcodec h264 -f flv INPUT_STREAM_URI

Receber o URL do endpoint e o token do portador

Para receber o URL do endpoint do conteúdo de prévia e o token do portador necessário para autenticação, use o método projects.locations.inputs.preview.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_NUMBER: o número do seu projeto Google Cloud , que está localizado no campo Número do projeto na página Configurações do IAM
  • LOCATION: o local em que o endpoint de entrada está localizado. Use uma das regiões compatíveis.
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: o identificador definido pelo usuário para o endpoint de entrada

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "uri":  ENDPOINT_URL, # For example, "preview.k3fhpvei3vvf.us-central1.livestream.goog/inputs/my-preview-input",
  "bearerToken": "BEARER_TOKEN"
}

Você vai usar os valores dos campos uri e bearerToken na próxima seção.

Mostrar o conteúdo da prévia

Você tem as seguintes opções principais para mostrar o conteúdo da prévia:

  • mpegts.js, um player de stream HTML5
  • FFplay, um player de mídia de linha de comando

mpegts.js

mpegts.js é uma biblioteca disponível no GitHub para reproduzir streams MPEG-TS em um navegador da Web.

Copie os valores dos campos bearerToken e uri que você recebeu em uma etapa anterior no HTML a seguir. Crie um arquivo HTML com o código a seguir e abra-o em um navegador.

<html>
  <head>
  <script src="https://xqq.im/mpegts.js/dist/mpegts.js"></script>
  <video id="video" autoplay controls muted></video>
  <script>
    function main() {
      if (!mpegts.getFeatureList().mseLivePlayback) {
        console.log("MSE live playback is not supported by the browswer!")
        return;
      }
      var videoElement = document.getElementById("video");
      player = mpegts.createPlayer(
        {
          type: "mse",
          isLive: true,
          <!-- Placeholder: Replace ENDPOINT_URL with the actual endpoint URL -->
          url: "ENDPOINT_URL",
        },
        {
          headers: {
            <!-- Placeholder: Replace BEARER_TOKEN with the actual bearer token -->
            Authorization: "BEARER_TOKEN",
          },
        }
      );
      player.attachMediaElement(videoElement);
      player.load();
      player.play();
    }
    main();
  </script>
  </body>
</html>

Você vai ver um padrão de teste sendo transmitido com uma latência menor do que a transmissão ao vivo associada. Esse player de stream só pode tocar a primeira faixa de áudio em um stream.

Vídeo de padrão de teste

FFplay

O FFplay é um player de mídia versátil de linha de comando que usa as bibliotecas do FFmpeg. Você pode encontrar downloads do FFplay na página Fazer o download do FFmpeg.

Abra uma nova janela do terminal. Copie os valores dos campos bearerToken e uri que você recebeu em uma etapa anterior no comando a seguir e execute-o.

ffplay -headers "Authorization: Bearer BEARER_TOKEN" \
  -fflags nobuffer -flags low_delay -probesize 32 -analyzeduration 0 \
  ENDPOINT_URL

Você vai ver um padrão de teste sendo transmitido com uma latência menor do que a transmissão ao vivo associada. O ffplay permite alternar entre faixas de áudio pressionando a tecla "A".

Vídeo de padrão de teste

Limpar

Para evitar cobranças na conta do Google Cloud pelos recursos usados nesta página, siga estas etapas.

Interromper o canal

Use o método projects.locations.channels.stop para interromper o canal. É necessário interromper o canal antes de excluí-lo.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_NUMBER: o número do seu projeto Google Cloud , que está localizado no campo Número do projeto na página Configurações do IAM
  • LOCATION: o local em que seu canal está localizado. Use uma das regiões compatíveis
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: um identificador definido pelo usuário para o canal

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "stop",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Esse comando cria uma operação de longa duração (LRO) que pode ser usada para acompanhar o progresso da sua solicitação. Consulte Gerenciar operações de longa duração para mais informações.

Parar o stream de entrada

Se você usou ffmpeg para enviar o fluxo de entrada, a conexão será interrompida automaticamente depois que você parar o canal.

Excluir o canal

Use o método projects.locations.channels.delete para excluir o canal. É preciso excluir o canal antes de excluir o endpoint de entrada usado por ele.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_NUMBER: o número do seu projeto Google Cloud , que está localizado no campo Número do projeto na página Configurações do IAM
  • LOCATION: o local em que seu canal está localizado. Use uma das regiões compatíveis
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: um identificador definido pelo usuário para o canal

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID",
    "verb": "delete",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Esse comando cria uma operação de longa duração (LRO) que pode ser usada para acompanhar o progresso da sua solicitação. Consulte Gerenciar operações de longa duração para mais informações.

Excluir o endpoint de entrada

Use o método projects.locations.inputs.delete para excluir o endpoint de entrada.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_NUMBER: o número do seu projeto Google Cloud , que está localizado no campo Número do projeto na página Configurações do IAM
  • LOCATION: o local em que o endpoint de entrada está localizado. Use uma das regiões compatíveis.
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-south1
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-north1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: o identificador definido pelo usuário para o endpoint de entrada

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": CREATE_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
    "verb": "delete",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Esse comando cria uma operação de longa duração (LRO) que pode ser usada para acompanhar o progresso da sua solicitação. Consulte Gerenciar operações de longa duração para mais informações.

Excluir o bucket do Cloud Storage

  1. No console Google Cloud , acesse a página "Navegador do Cloud Storage".

    Acessar a página "Navegador do Cloud Storage"

  2. Marque a caixa de seleção ao lado do bucket criado.

  3. Clique em Excluir.

  4. Na caixa de diálogo exibida, clique em Excluir para excluir o bucket e o conteúdo dele.