Configurar legendas

Nesta página, explicamos como configurar legendas no formato Web Video Text Tracks (WebVTT) para uma transmissão ao vivo. As legendas são geradas com base nas legendas cea608 ou cea708 no fluxo de entrada.

As legendas são compatíveis com transmissões ao vivo HLS e DASH.

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 ou do Guia de início rápido para uma transmissão ao vivo MPEG-DASH.

Criar o endpoint de entrada

Para criar o 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
}

Copie a OPERATION_ID retornada para usar na próxima seção.

Verificar o resultado

Use o método projects.locations.operations.get para verificar se o endpoint de entrada foi criado. Se a resposta contiver "done: false", repita o comando até que a resposta contenha "done: true". A criação do primeiro endpoint de entrada em uma região pode levar até 10 minutos.

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
  • OPERATION_ID: o identificador da operação

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,
    "endTime": END_TIME,
    "target": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.Input",
    "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 o canal

Para criar o canal, use o método projects.locations.channels.create.

Observe o seguinte na configuração do canal:

  • Uma ElementaryStream, uma TextStream, é usada para as legendas.

    {
      "key": "webvtt-english",
      "textStream": {
        "codec": "webvtt",
        "display_name": "English",
        "language_code": "en-US",
        "mapping": [
          {
            "input_cea_channel": "CC1"
          }
        ]
      }
    }
    
  • O campo TextStream codec está definido como webvtt.

  • O campo TextStream mapping mapeia fluxos de entrada para faixas de texto. Neste exemplo, input_cea_channel é mapeado para o canal de entrada CC1 para legendas em inglês.

  • O fluxo elementar é usado para criar um MuxStream com a chave vtt-english.

    {
      "key": "vtt_english",
      "container": "vtt",
      "elementaryStreams": [
        "webvtt-english"
      ],
      "segmentSettings": {
        "segmentDuration": "2s"
      }
    }
    

    Essa transmissão multiplexada é referenciada nos manifestos HLS e DASH.

    {
      "fileName": "main.m3u8",
      "type": "HLS",
      "muxStreams": [
        "mux_video_ts",
        "vtt_english"
      ],
      "maxSegmentCount": 5
    }
    

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
      }
    },
    {
      "key": "webvtt-english",
      "textStream": {
        "codec": "webvtt",
        "display_name": "English",
        "language_code": "en-US",
        "mapping": [
          {
            "input_cea_channel": "CC1"
          }
        ]
      }
    }
  ],
  "muxStreams": [
    {
      "key": "mux_video_fmp4",
      "container": "fmp4",
      "elementaryStreams": [
        "es_video"
      ],
      "segmentSettings": {
        "segmentDuration": "2s"
      }
    },
    {
      "key": "mux_audio_fmp4",
      "container": "fmp4",
      "elementaryStreams": [
        "es_audio"
      ],
      "segmentSettings": {
        "segmentDuration": "2s"
      }
    },
    {
      "key": "mux_video_ts",
      "container": "ts",
      "elementaryStreams": [
        "es_video",
        "es_audio"
      ],
      "segmentSettings": {
        "segmentDuration": "2s"
      }
    },
    {
      "key": "vtt_english",
      "container": "vtt",
      "elementaryStreams": [
        "webvtt-english"
      ],
      "segmentSettings": {
        "segmentDuration": "2s"
      }
    }
  ],
  "manifests": [
    {
      "key": "manifest_dash",
      "fileName": "main.mpd",
      "type": "DASH",
      "muxStreams": [
        "mux_video_fmp4",
        "mux_audio_fmp4",
        "vtt_english"
      ],
      "maxSegmentCount": 5
    },
    {
      "key": "manifest_hls",
      "fileName": "main.m3u8",
      "type": "HLS",
      "muxStreams": [
        "mux_video_ts",
        "vtt_english"
      ],
      "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
}

Acessar o canal

É possível verificar o resultado da operação de criação do canal usando o novo ID de operação.

Depois de criar o canal, use o método projects.locations.channels.get para consultar o estado do canal.

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/channels/CHANNEL_ID",
  "createTime": CREATE_TIME,
  "updateTime": UPDATE_TIME,
  "inputAttachments": [
    {
      "key": "INPUT_ID",
      "input": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID"
    }
  ],
  "activeInput": "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
      }
    },
    {
      "key": "webvtt-english",
      "textStream": {
        "codec": "webvtt",
        "display_name": "English",
        "language_code": "en-US",
        "mapping": [
          {
            "input_cea_channel": "CC1"
          }
        ]
      }
    }
  ],
  "muxStreams": [
    {
      "key": "mux_video_fmp4",
      "container": "fmp4",
      "elementaryStreams": [
        "es_video"
      ],
      "segmentSettings": {
        "segmentDuration": "2s"
      }
    },
    {
      "key": "mux_audio_fmp4",
      "container": "fmp4",
      "elementaryStreams": [
        "es_audio"
      ],
      "segmentSettings": {
        "segmentDuration": "2s"
      }
    },
    {
      "key": "mux_video_ts",
      "container": "ts",
      "elementaryStreams": [
        "es_video",
        "es_audio"
      ],
      "segmentSettings": {
        "segmentDuration": "2s"
      }
    },
    {
      "key": "vtt_english",
      "container": "vtt",
      "elementaryStreams": [
        "webvtt-english"
      ],
      "segmentSettings": {
        "segmentDuration": "2s"
      }
    }
  ],
  "manifests": [
    {
      "key": "manifest_dash",
      "fileName": "main.mpd",
      "type": "DASH",
      "muxStreams": [
        "mux_video_fmp4",
        "mux_audio_fmp4",
        "vtt_english"
      ],
      "maxSegmentCount": 5
    },
    {
      "key": "manifest_hls",
      "fileName": "main.m3u8",
      "type": "HLS",
      "muxStreams": [
        "mux_video_ts",
        "vtt_english"
      ],
      "maxSegmentCount": 5
    }
  ],
  "streamingState": "STOPPED"
}

A resposta completa contém o seguinte campo:

{
  ...
  "streamingState": "STOPPED"
  ...
}

Essa resposta indica que você já pode iniciar o canal.

Iniciar o canal

Use o método projects.locations.channels.start para iniciar o canal. Um canal precisa ser iniciado antes de aceitar fluxos de entrada ou gerar um fluxo de saída.

Iniciar o primeiro canal em uma região leva cerca de 10 minutos.

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
}

Para determinar se o canal foi iniciado, receba as informações do canal como feito anteriormente. A resposta precisa conter o seguinte:

{
  ...
  "streamingState": "AWAITING_INPUT"
  ...
}

Enviar o stream de entrada

Agora que o canal está pronto, envie um stream de entrada para o endpoint de entrada para gerar a transmissão ao vivo. Você pode baixar um MP4 (ou outro TEST_VOD_FILE) com legendas e usar ffmpeg para enviar ao endpoint de entrada.

Abra uma nova janela do terminal. Execute o comando a seguir usando o INPUT_STREAM_URI da seção Verificar o resultado:

ffmpeg -re -stream_loop -1 -i "TEST_VOD_FILE" \
  -c:v copy -c:a aac -strict 2 -f "flv" "INPUT_STREAM_URI"

Assistir a transmissão ao vivo gerada

Para reproduzir o arquivo de mídia gerado no Shaka Player (em inglês), conclua as seguintes etapas:

  1. Torne o bucket do Cloud Storage criado publicamente legível.
  2. Para ativar o compartilhamento de recursos entre origens (CORS, na sigla em inglês) em um bucket do Cloud Storage, faça o seguinte:
    1. Crie um arquivo JSON que contenha o seguinte:
      [
        {
          "origin": ["https://shaka-player-demo.appspot.com/"],
          "responseHeader": ["Content-Type", "Range"],
          "method": ["GET", "HEAD"],
          "maxAgeSeconds": 3600
        }
      ]
    2. Execute o seguinte comando depois de substituir JSON_FILE_NAME pelo nome do arquivo JSON criado na etapa anterior:
      gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
  3. No bucket do Cloud Storage, localize o arquivo main.m3u8 gerado. Clique em Copiar URL na coluna Acesso público do arquivo.
  4. Acesse o Shaka Player, um player de transmissão ao vivo on-line.
  5. Clique em Conteúdo personalizado na barra de navegação superior.
  6. Clique no botão +.
  7. Cole o URL público do arquivo na caixa URL do manifesto.

  8. Digite um nome na caixa Nome.

  9. Clique em Salvar.

  10. Clique em Reproduzir.

A transmissão ao vivo vai começar. Talvez seja necessário ativar as legendas na interface do Shaka Player.

Limpar

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
}

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. É necessário 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
}

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
}

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 permanentemente o bucket e o conteúdo dele.