Crie uma sessão de DVR

Esta página mostra-lhe como criar uma sessão de gravador de vídeo digital (DVR) a partir de uma stream em direto através da API Live Stream. Pode ver uma sessão de DVR durante uma stream em direto e depois de esta terminar.

Diferenças entre sessões de DVR e clipes de canais

As sessões de DVR são semelhantes aos clipes de canais (também conhecidos como clipes VOD) com as seguintes diferenças importantes:

  • Sessões de DVR:
    • A API guarda o manifesto do DVR na mesma localização que os segmentos da stream em direto, pelo que não é necessária uma cópia adicional para o Cloud Storage. O manifesto de DVR é semelhante ao manifesto da stream em direto, mas mais longo. Quando o período de retenção expira, o manifesto é eliminado juntamente com os ficheiros de segmentos.
    • Pode criar uma sessão de DVR para conteúdo passado, atual e futuro. Por exemplo, uma sessão de DVR pode seguir uma stream em direto ou pode agendar uma sessão de DVR para iniciar e parar numa hora futura.
    • Um exemplo de utilização típico das sessões de DVR é suportar capacidades de DVR para eventos de streaming em direto. Por exemplo, um visitante pode juntar-se à stream em direto uma hora após o início e ver o conteúdo com um atraso de uma hora (ou ignorar partes do mesmo).
  • Clipes de canais:
    • A API Live Stream copia o manifesto do clipe e os ficheiros de segmento associados para um diretório especificado pelo utilizador, para que não sejam eliminados quando o período de retenção expirar. Tem controlo total do clipe.
    • Só é possível criar clipes de conteúdo passado. Os clipes em direto e o agendamento de clipes futuros não são suportados.
    • Um exemplo de utilização típico dos clipes é arquivar uma stream em direto, tornando-a disponível como um ficheiro VOD indefinidamente.

Para mais informações sobre os clipes de canal, consulte o artigo Crie clipes de VOD a partir de uma stream em direto.

Configure o seu Google Cloud projeto e autenticação

Se não tiver criado um Google Cloud projeto e credenciais, consulte a secção Antes de começar.

Crie um ponto final de entrada

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

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • PROJECT_NUMBER: o número do seu Google Cloud projeto. Este encontra-se no campo Número do projeto na página Definições do IAM
  • LOCATION: a localização na qual criar o ponto final de entrada; use uma das regiões suportadas
    Mostrar localizações
    • 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 utilizador para o novo ponto final de entrada a criar (para o qual envia a sua stream de entrada). Este valor tem de ter entre 1 e 63 carateres, começar e terminar com [a-z0-9] e pode conter travessões (-) entre carateres. Por exemplo, my-input.

Para enviar o seu pedido, expanda uma destas opções:

Deve receber uma resposta JSON semelhante à seguinte:

{
  "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
}

Este comando cria uma operação de longa duração (LRO) que pode usar para acompanhar o progresso do seu pedido. Consulte o artigo Faça a gestão de operações de longa duração para mais informações.

Obtenha detalhes do ponto final de entrada

Para obter os detalhes do ponto final de entrada, use o método projects.locations.inputs.get.

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • PROJECT_NUMBER: o número do seu Google Cloud projeto. Este encontra-se no campo Número do projeto na página Definições do IAM
  • LOCATION: a localização onde o seu ponto final de entrada está localizado; use uma das regiões suportadas
    Mostrar localizações
    • 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 utilizador para o ponto final de entrada

Para enviar o seu pedido, expanda uma destas opções:

Deve receber uma resposta JSON semelhante à seguinte:

{
  "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 valor INPUT_STREAM_URI devolvido para usar mais tarde na secção Envie a stream de teste de entrada.

Crie um canal

Para criar um canal, use o método projects.locations.channels.create. Os seguintes exemplos criam um canal que gera uma stream em direto HLS. A stream em direto consiste numa única renderização de alta definição (1280 x 720).

Para ativar a criação de sessões de DVR, adicione o objeto retentionConfig à configuração do canal.

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

Quando a retenção está ativada para um canal de stream em direto, os segmentos da stream em direto e o manifesto são retidos para criar sessões de DVR. O objeto retentionWindowDuration especifica o período durante o qual a saída da stream em direto é guardada após o carregamento para o Cloud Storage. O período de retenção começa no momento em que o segmento é criado no Cloud Storage.

O período de retenção está limitado a 30 dias. Depois de o período de retenção terminar, os ficheiros de segmentos, o manifesto da stream em direto e o manifesto do DVR são eliminados automaticamente do Cloud Storage. Não pode criar sessões de DVR com segmentos eliminados. O processo de eliminação é assíncrono e pode demorar até 24 horas a ser concluído.

Especifique uma chave para o manifesto para ativar a criação de sessões de DVR. Refere-se a esta chave quando cria efetivamente a sessão. Apenas são suportados manifestos HLS.

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

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • PROJECT_NUMBER: o número do seu Google Cloud projeto. Este encontra-se no campo Número do projeto na página Definições do IAM
  • LOCATION: a localização na qual criar o canal; use uma das regiões suportadas
    Mostrar localizações
    • 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 utilizador para o canal a criar; este valor tem de ter entre 1 e 63 carateres, começar e terminar com [a-z0-9] e pode conter traços (-) entre carateres
  • INPUT_ID: o identificador definido pelo utilizador para o ponto final de entrada
  • BUCKET_NAME: o nome do contentor do Cloud Storage que criou para conter o manifesto da stream em direto e os ficheiros de segmentos

Para enviar o seu pedido, expanda uma destas opções:

Deve receber uma resposta JSON semelhante à seguinte:

{
  "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
}

Este comando cria uma operação de longa duração (LRO) que pode usar para acompanhar o progresso do seu pedido. Consulte o artigo Faça a gestão de operações de longa duração para mais informações.

Inicie o canal

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

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • PROJECT_NUMBER: o número do seu Google Cloud projeto. Este encontra-se no campo Número do projeto na página Definições do IAM
  • LOCATION: a localização onde o seu canal está localizado; use uma das regiões suportadas
    Mostrar localizações
    • 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 utilizador para o canal

Para enviar o seu pedido, expanda uma destas opções:

Deve receber uma resposta JSON semelhante à seguinte:

{
  "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
}

Este comando cria uma operação de longa duração (LRO) que pode usar para acompanhar o progresso do seu pedido. Consulte o artigo Faça a gestão de operações de longa duração para mais informações.

Envie a stream de teste de entrada

Abra uma nova janela de terminal. Execute o seguinte comando, usando INPUT_STREAM_URI da secção Obtenha detalhes do ponto final de entrada:

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

Crie uma sessão de DVR

Para criar uma sessão de DVR, use o método projects.locations.channels.dvrSessions.create.

Use o campo manifestKey na matriz dvrManifests para especificar o manifesto a partir do qual guardar conteúdo. No exemplo de configuração do canal nesta página, esta chave está definida como manifest_hls.

Pode combinar várias secções de tempo da stream em direto numa única sessão de DVR adicionando objetos timeInterval à matriz dvrWindows.

"dvrManifests": [
  {
    "manifestKey": "manifest_hls"
  }
],
"dvrWindows": [
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:03:20.000Z",
      "endTime": "2022-07-08T23:04:20.000Z"
    }
  },
  {
    "timeInterval": {
      "startTime": "2022-07-08T23:05:20.000Z",
      "endTime": "2022-07-08T23:06:20.000Z"
    }
  }
]

Tenha em conta o seguinte:

  • Cada sessão de DVR tem de conter, pelo menos, um timeInterval em dvrWindows.
  • O campo dvrManifests.manifestKey tem de fazer referência a um manifesto HLS definido no canal principal da sessão de DVR. Se o pedido de criação da sessão de DVR for bem-sucedido, o URI do manifesto de DVR gerado é devolvido no campo dvrManifests.outputUri. Este URI encontra-se no caminho especificado pelo campo outputUri do canal.
  • A matriz dvrManifests só suporta um manifesto por pedido. Se quiser gerar vários manifestos para as mesmas janelas de DVR, tem de dividir os manifestos em várias sessões de DVR.
  • O conjunto de objetos timeInterval não pode ter sobreposições e tem de estar por ordem cronológica. O startTime tem de ser anterior ao endTime em todos os timeInterval.
  • startTime e endTime referem-se à cronologia da stream em direto. Se o código de tempo incorporado estiver ativado para o manifesto, esta cronologia baseia-se no código de tempo incorporado fornecido no fluxo de entrada e pode diferir do relógio de parede.
  • A duração total máxima da janela DVR é de 24 horas.
  • O endTime do último timeInterval em dvrWindows pode ser deixado em branco. Neste caso, o valor de endTime é calculado automaticamente para maximizar a duração da sessão de DVR (ou seja, uma duração total de 24 horas).
  • As janelas de DVR podem abranger qualquer intervalo de tempo, incluindo os do futuro. No entanto, o número de sessões de DVR com dvrWindows extensão para um horário futuro está limitado a uma.
  • Não existe limite para o número de sessões de DVR em que todas as janelas de DVR estão estritamente no passado.

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • PROJECT_NUMBER: o número do seu Google Cloud projeto. Este encontra-se no campo Número do projeto na página Definições do IAM
  • LOCATION: a localização onde o seu canal está localizado; use uma das regiões suportadas
    Mostrar localizações
    • 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 utilizador para o canal
  • DVR_SESSION_ID: um identificador definido pelo utilizador para a sessão de DVR
  • INTERVAL_START_TIME: a hora de início da marcação no tempo de época Unix no manifesto da stream em direto original; usa uma data/hora no formato "Zulu" UTC RFC3339 (por exemplo, 2014-10-02T15:01:23Z)
  • INTERVAL_END_TIME: a hora de exclusão da época Unix no manifesto da stream em direto original; usa uma data/hora no formato "Zulu" UTC RFC3339 (por exemplo, 2014-10-02T15:01:23Z)

Para enviar o seu pedido, expanda uma destas opções:

Deve receber uma resposta JSON semelhante à seguinte:

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

Este comando cria uma operação de longa duração (LRO) que pode usar para acompanhar o progresso do seu pedido. Consulte o artigo Faça a gestão de operações de longa duração para mais informações.

Obtenha a sessão de DVR

Para obter uma sessão de DVR, use o método projects.locations.channels.dvrSessions.get.

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • PROJECT_NUMBER: o número do seu Google Cloud projeto. Este encontra-se no campo Número do projeto na página Definições do IAM
  • LOCATION: a localização onde o seu canal está localizado; use uma das regiões suportadas
    Mostrar localizações
    • 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 utilizador para o canal
  • DVR_SESSION_ID: um identificador definido pelo utilizador para a sessão de DVR

Para enviar o seu pedido, expanda uma destas opções:

Deve receber uma resposta JSON semelhante à seguinte:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/channels/CHANNEL_ID/dvrSessions/DVR_SESSION_ID",
  "createTime": CREATE_TIME,
  "startTime": START_TIME,
  "updateTime": UPDATE_TIME,
  "state": "SUCCEEDED",
  "dvrManifests": [
    {
      "manifestKey": "manifest_hls",
      "outputUri": "gs://BUCKET_NAME/dvr/DVR_SESSION_ID/main.m3u8"
    }
  ],
  "dvrWindows": [
    {
      "timeInterval": {
        "startTime": "INTERVAL_START_TIME",
        "endTime": "INTERVAL_END_TIME"
      }
    }
  ]
}

A resposta deve conter um campo state que indica o estado da sessão:

{
  ...
  "state": "PENDING" // DVR session is waiting to be processed (for example, it is waiting for the channel to start)
  ...
}

Consulte a documentação de referência state para ver a lista de estados e respetivas descrições.

Valide o conteúdo do contentor

Abra o contentor do Cloud Storage conforme especificado no campo dvrManifests.outputUri da sessão de DVR. Verifique se contém os seguintes ficheiros e diretórios:

  • Um manifesto de nível superior para a sessão de DVR com o mesmo nome que o manifests.fileName especificado na configuração do canal (por exemplo, main.m3u8). Pode reproduzir este manifesto através de um leitor de multimédia online.
  • Um subdiretório para cada muxStreams.key especificado no canal (por exemplo, mux_video_ts). Cada subdiretório contém uma playlist para a sessão de DVR (por exemplo, index-1.m3u8).

Reproduzir a sessão de DVR

Para reproduzir o ficheiro multimédia gerado no Shaka Player, conclua os seguintes passos:

  1. Torne o contentor do Cloud Storage que criou publicamente legível.
  2. Para ativar a partilha de recursos de origem cruzada (CORS) num contentor do Cloud Storage, faça o seguinte:
    1. Crie um ficheiro 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 ficheiro JSON que criou no passo anterior:
      gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
  3. No contentor do Cloud Storage, encontre o ficheiro gerado. Clique em Copiar URL na coluna Acesso público do ficheiro.
  4. Navegue para Shaka Player, um leitor de streams em direto online.
  5. Clique em Conteúdo personalizado na barra de navegação superior.
  6. Clique no botão +.
  7. Cole o URL público do ficheiro na caixa URL do manifesto.

  8. Introduza um nome na caixa Nome.

  9. Clique em Guardar.

  10. Clique em Jogar.

Deve ver um padrão de teste a ser reproduzido como stream em direto.

Vídeo de padrão de teste

Eventos de pausas para anúncios

Se criou um evento de intervalo de anúncios para a stream em direto, a sessão de DVR contém os segmentos de anúncios tal como aparecem na stream em direto.