Criar sobreposições estáticas

Nesta página, mostramos como gerar imagens de sobreposição estáticas sobre uma transmissão ao vivo. Uma imagem de sobreposição estática persiste durante toda a transmissão ao vivo. É possível configurar a resolução e a posição de uma imagem estática de sobreposição.

Configurar o projeto e a autenticação do Google Cloud

Se você ainda não criou projeto e credenciais do Google Cloud, consulte Antes de começar.

Faça upload de uma imagem para o bucket do Cloud Storage

  1. No console do Google Cloud, acesse a página "Navegador do Cloud Storage".
    Acesse a página "Navegador do Cloud Storage"
  2. Clique no nome do bucket para abri-lo.
  3. Clique em Fazer o upload dos arquivos.
  4. Selecione um arquivo de imagem (JPEG ou PNG) para fazer upload do seu computador local. Você use esta imagem de sobreposição de amostra.

A imagem será salva no bucket do Cloud Storage.

Criar um recurso

Os recursos são vídeos ou imagens que podem ser usados com a API Live Stream. Crie um recurso de imagem para usar como uma sobreposição estática.

Para criar um recurso, use o método projects.locations.assets.create.

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

  • PROJECT_NUMBER: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAM
  • LOCATION: o local em que o asset; usar uma das regiões com suporte;
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • ASSET_ID: um identificador definido pelo usuário para o novo recurso a ser criado. Esse valor precisa ter de 1 a 63 caracteres, começar e terminar com [a-z0-9]. pode conter traços (-) entre os caracteres. Por exemplo, my-asset.
  • ASSET_URI: o URI da imagem no seu Bucket do Cloud Storage a ser usado, como gs://my-bucket/my-image.png

Corpo JSON da solicitação:

{
  "image": {
    "uri": "ASSET_URI"
  }
}

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/assets/ASSET_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Copiar o OPERATION_ID para usar em na próxima seção.

Verificar o resultado

Use o método projects.locations.operations.get para verificar se o recurso foi criado. Se a resposta contiver "done: false", repita o comando até que a resposta contenha "done: true".

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

  • PROJECT_NUMBER: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAM
  • LOCATION: o local onde o recurso está. localizado; usar uma das regiões com suporte;
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • 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/assets/ASSET_ID",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.Asset",
    "name": "projects/PROJECT_NUMBER/locations/LOCATION/assets/ASSET_ID",
    "createTime": CREATE_TIME,
    "updateTime": UPDATE_TIME,
    "image": {
      "uri": "ASSET_URI"
    },
    "crc32c": "ae1EJg==",
    "state": "ACTIVE"
  }
}

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: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAM
  • LOCATION: o local em que a entrada será criada. endpoint; usar uma das regiões com suporte;
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • INPUT_ID: um identificador definido pelo usuário para a nova entrada. endpoint a ser criado (para onde você enviará o fluxo de entrada). Esse valor precisa ter de 1 a 63 caracteres, começar e terminar com [a-z0-9]. 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
}

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

Receber detalhes do endpoint de entrada

Para conferir 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: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAM
  • LOCATION: o local onde está o endpoint de entrada. localizado; usar uma das regiões com suporte;
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • 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 o canal

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

Observe a matriz staticOverlays na configuração do canal:

"staticOverlays": [
  {
    "asset": "projects/PROJECT_NUMBER/locations/LOCATION/assets/ASSET_ID",
    "position": {
      "x": 0.5,
      "y": 0.5
    },
    "resolution": {
      "w": 0.1
    },
    "opacity": 0.8
  }
],

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

  • PROJECT_NUMBER: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAM
  • LOCATION: o local em que o canal será criado. Use uma das regiões com suporte.
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
  • CHANNEL_ID: um identificador definido pelo usuário para o canal. criar, esse valor precisa ter de 1 a 63 caracteres, começar e terminar com [a-z0-9]; 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 Cloud Storage. bucket que você criou para armazenar o manifesto da transmissão ao vivo e os arquivos de segmento
  • ASSET_ID: o identificador definido pelo usuário para o recurso

Corpo JSON da solicitação:

{
  "inputAttachments": [
    {
      "key": "my-input",
      "input": "projects/PROJECT_NUMBER/locations/LOCATION/inputs/INPUT_ID"
    }
  ],
  "output": {
    "uri": "gs://BUCKET_NAME"
  },
  "staticOverlays": [
    {
      "asset": "projects/PROJECT_NUMBER/locations/LOCATION/assets/ASSET_ID",
      "position": {
        "x": 0.5,
        "y": 0.5
      },
      "resolution": {
        "w": 0.1
      },
      "opacity": 0.8
    },
  ],
  "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
}

Você pode conferir o resultado da criação do canal operação usando o novo ID de operação.

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: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAM
  • LOCATION: o local onde seu canal está. localizado; usar uma das regiões com suporte;
    Mostrar locais
    • us-central1
    • us-east1
    • us-east4
    • us-west1
    • us-west2
    • northamerica-northeast1
    • southamerica-east1
    • asia-east1
    • asia-east2
    • asia-northeast1
    • asia-southeast1
    • australia-southeast1
    • 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
}

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

Enviar o stream de entrada

Abra uma nova janela do terminal. Execute o comando a seguir, usando INPUT_STREAM_URI do Seção Receber detalhes do endpoint de entrada:

ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
  -acodec aac -vcodec h264 -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, encontre o arquivo main.m3u8. 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 Jogar

A sobreposição vai aparecer sobre a transmissão ao vivo.

Vídeo de padrão de teste