Criar clipes VOD de uma transmissão ao vivo

Esta página descreve como criar clipes de vídeo sob demanda (VOD) de uma transmissão ao vivo usando a API Live Stream. Os clipes de VOD são compostos por arquivos de manifesto HLS e arquivos de segmento salvos de uma transmissão ao vivo. Somente manifestos HLS são aceitos.

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.

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: 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] e pode conter traços (-) entre os caracteres. Por exemplo, my-input.

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, na sigla em inglês) que pode ser usada para acompanhar o andamento da sua solicitação. Consulte Gerenciar operações de longa duração para mais informações.

Receber detalhes do endpoint de entrada

Para obter 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 projeto do Google Cloud, 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 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 para usar mais tarde na seção Enviar o fluxo de entrada.

Criar um canal

Para criar um canal, use o projects.locations.channels.create . Os exemplos a seguir criam um canal que gera um HLS ao vivo riacho. A transmissão ao vivo consiste em um único vídeo em alta definição (1280 x 720) versão.

Para ativar a criação de clipes VOD, adicione o objeto retentionConfig à configuração do canal.

"retentionConfig": {
  "retentionWindowDuration": {
      "seconds": 86400
    }
},

Quando a retenção está ativada para um canal de transmissão ao vivo, o segmento e o manifesto são retidos para criar clipes VOD. O objeto retentionWindowDuration especifica o tempo de armazenamento da saída da transmissão ao vivo depois do upload para o Cloud Storage. A janela de retenção começa no momento em que o segmento é criado no Cloud Storage. A janela de retenção é limitada a 30 dias. Depois que a janela de retenção expirar, o segmento será excluído automaticamente do Cloud Storage. Não é possível criar clipes VOD usando segmentos excluídos. O processo de exclusão é assíncrono e pode levar até 24 horas para ser concluído.

Especifique uma chave do manifesto para ativar a criação de clipes VOD. Você se refere a isso na hora de criar o clipe. Só há suporte para manifestos HLS.

"manifests": [
{
  ...
  "key": "manifest_hls"
}

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

  • PROJECT_NUMBER: o número do projeto do Google Cloud, localizado no campo Número do projeto na página Configurações do IAM.
  • LOCATION: o local em que o canal; 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. 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 bucket do Cloud Storage criado para armazenar o manifesto e os arquivos de segmento da transmissão ao vivo

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, na sigla em inglês) que pode ser usada para acompanhar o andamento da solicitação. Consulte Gerencie 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: 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 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-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
}

Esse comando cria uma operação de longa duração (LRO, na sigla em inglês) que pode ser usada para acompanhar o andamento da solicitação. Consulte Gerenciar operações de longa duração para mais informações.

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

Criar um clipe de VOD

Para criar um clipe de VOD, use o método projects.locations.channels.clips.create.

Use o campo outputUri para especificar o local em que o arquivo será salvo. o arquivo de manifesto de clipes e clipes no Cloud Storage. Você pode usar o mesmo bucket criado para o manifesto da transmissão ao vivo ou um bucket diferente. Você pode também anexar um nome de diretório ao nome do bucket (por exemplo, my-bucket/vod-clip).

Use o campo manifestKey na matriz clipManifests para especificar o manifesto de onde salvar os clipes. No exemplo de configuração do canal nesta página, essa chave está definida como manifest_hls.

Você pode combinar várias seções de tempo da transmissão ao vivo em um único clipe. adicionando objetos timeSlice à matriz slices.

"outputUri": "gs://my-bucket",
"clipManifests":[
  {
    "manifestKey": "manifest_hls"
  }
],
"slices":[
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:03:20.000Z",
      "markoutTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeSlice": {
      "markinTime": "2022-07-08T23:05:20.000Z",
      "markoutTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

Observe o seguinte:

  • Cada clipe deve conter pelo menos um timeSlice na slices
  • O campo clipManifests.manifestKey precisa se referir a um manifesto HLS definido no canal pai do clipe. Se a criação do job de clipe for bem-sucedida, o URI do manifesto de clipe gerado será retornado em no campo clipManifests.outputUri. Esse URI está no caminho especificado pelo campo outputUri do clipe.
  • A matriz clipManifests aceita apenas um manifesto por solicitação. Se quiser gerar vários manifestos para o mesmo job de clipe, você precisa dividir os manifestos em várias solicitações de job de clipe.
  • As fatias de clipe precisam ser homogêneas. Todos os elementos precisam ser do tipo timeSlice.
  • O conjunto de objetos timeSlice não pode se sobrepor e precisa estar em ordem cronológica. O markinTime precisa ser anterior a a markoutTime em cada timeSlice.
  • Se o último markinTime de um clipe for anterior ao o horário de início do canal ou o início da janela de retenção, depois a marcação é definido como o último dos dois.
  • Se o último markoutTime de um clipe for posterior ao horário de término do canal, ele será definido como o horário de término do canal. Se o último markoutTime de um clipe for posterior ao horário do relógio do sistema atual, ele será definido como o horário em que a API realmente iniciar a tarefa de recorte.
  • A duração máxima de um clipe é de 24 horas.

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 seu canal está localizado. 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.
  • CLIP_ID: um identificador definido pelo usuário para o clipe VOD.
  • MARK_IN_TIME: o horário da época Unix de marcação em o manifesto original da transmissão ao vivo; usa um carimbo de data/hora em RFC3339 UTC "Zulu" formato (por exemplo, 2014-10-02T15:01:23Z)
  • MARK_OUT_TIME: o horário da época Unix de marcação no manifesto original da transmissão ao vivo. usa um carimbo de data/hora em RFC3339 UTC "Zulu" formato (para exemplo: 2014-10-02T15:01:23Z)
  • BUCKET_NAME: o nome do Cloud Storage. bucket que você criou para armazenar o manifesto de clipes VOD e os arquivos de segmento é possível usar o mesmo bucket que você criou para o manifesto de transmissão ao vivo ou para um bucket diferente. também é possível anexar um diretório ao nome do bucket (por exemplo, my-bucket/vod-clip)

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

Esse comando cria uma operação de longa duração (LRO, na sigla em inglês) que pode ser usada para acompanhar o andamento da sua solicitação. Consulte Gerencie operações de longa duração para mais informações.

Baixar o clipe VOD

Para receber um clipe de VOD, use o método projects.locations.channels.clips.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 seu canal está. localizada; 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.
  • CLIP_ID: um identificador definido pelo usuário para o clipe VOD.

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/clips/CLIP_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "outputUri": "gs://BUCKET_NAME",
  "slices": [
    {
      "timeSlice": {
        "markinTime": "MARK_IN_TIME",
        "markoutTime": "MARK_OUT_TIME"
      }
    }
  ],
  "features": {},
  "clipManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/main.m3u8"
    }
  ]
}

O manifesto gerado está localizado no URI especificado no clipManifests.outputUri. O nome do arquivo do manifesto é igual ao valor do campo manifests.fileName do canal pai.

A resposta precisa conter o seguinte:

{
  ...
  "state": "SUCCEEDED"
  ...
}

Apenas os 1.000 registros de jobs de clipe mais recentes por canal estão disponíveis usando o método projects.locations.channels.clips.get. Todos os registros de clipes anteriores ao limite são removidos. Você precisa gerenciar o clipe gerado especificados pelo outputUri; a API Live Stream não exclui esses arquivos do Cloud Storage.

Verificar o conteúdo do bucket

Abra o bucket do Cloud Storage conforme especificado no arquivo outputUri. Verifique se ele contém os seguintes arquivos e diretórios:

  • Um manifesto de nível superior para o clipe com o mesmo nome do manifests.fileName especificado no canal configuração (por exemplo, main.m3u8); você pode reproduzir esse manifesto usando um player de mídia on-line
  • Um diretório para cada muxStreams.key especificado no canal (por exemplo, mux_video_ts)
    • Uma playlist para o clipe (por exemplo, index-1.m3u8)
    • Um diretório nomeado usando o formato YYYYMMDDTHHMMSSZ (por exemplo, 20220708T203309Z/). Esse diretório contém os segmentos de clipe de VOD
      • Vários arquivos segment-number.ts de segmento que compõem o clipe VOD

Assistir o clipe VOD

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 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 Jogar.

Você verá um padrão de teste sendo transmitido como transmissão ao vivo.

Vídeo de padrão de teste

Eventos de intervalo de anúncio e de barreira

Se você criou um evento de intervalo de anúncio para a transmissão ao vivo, os clipes de VOD não vão conter os anúncios. A API gera uma playlist com os limites de anúncios substituídos pelas seguintes tags:

#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN

As barreiras que aparecem no início ou no fim do clipe VOD são automaticamente removida. Barreiras que aparecem dentro da transmissão, cercadas pela transmissão ao vivo são retidos no clipe VOD gerado.