Criar uma sessão de DVR

Nesta página, mostramos como criar uma sessão de gravador de vídeo digital (DVR) a partir de uma transmissão ao vivo usando a API Live Stream. É possível assistir uma sessão de DVR durante uma transmissão ao vivo ou depois que ela termina.

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

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

  • Sessões de DVR:
    • A API salva o manifesto do DVR no mesmo local dos segmentos de transmissão ao vivo, para que não haja cópias adicionais no Cloud Storage. O manifesto do DVR é semelhante ao manifesto de transmissão ao vivo, mas é mais longo. Quando a janela de retenção expirar, o manifesto será excluído junto com os arquivos de segmento.
    • É possível criar uma sessão de DVR para conteúdo passado, atual e futuro. Por exemplo, uma sessão de DVR pode seguir uma transmissão ao vivo, ou você pode programar uma sessão de DVR para começar e parar em um horário futuro.
    • Um caso de uso típico para sessões de DVR é oferecer suporte a recursos de DVR para eventos de streaming ao vivo. Por exemplo, um espectador pode entrar na transmissão ao vivo uma hora depois do início e assistir o conteúdo com um atraso de uma hora (ou pular partes dele).
  • Clipes do canal:
    • A API Live Stream copia o manifesto do clipe e os arquivos de segmento associados para um diretório especificado pelo usuário para que eles não sejam excluídos quando a janela de retenção expirar. Você tem controle total sobre o clipe.
    • Só é possível criar clipes de conteúdo anterior. Não é possível usar clipes ao vivo e programar clipes futuros.
    • Um caso de uso típico para clipes é arquivar uma transmissão ao vivo, disponibilizando-a como um arquivo VOD por tempo indeterminado.

Para mais informações sobre os clipes de canal, consulte Criar clipes VOD de uma transmissão ao vivo.

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

Se você não criou um projeto do Google Cloud e credenciais, 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: 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 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-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 o qual você envia o 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.

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 solicitação. Consulte Gerenciar operações de longa duração para mais informações.

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: 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-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 stream de teste 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 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 é ativada para um canal de transmissão ao vivo, os segmentos de transmissão ao vivo e o manifesto são retidos para criar sessões de DVR. O objeto retentionWindowDuration especifica o tempo em que a saída da transmissão ao vivo é salva após o 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 passa, os arquivos de segmento, o manifesto de transmissão ao vivo e o manifesto de DVR são excluídos automaticamente do Cloud Storage. Não é possível criar sessões de DVR usando segmentos excluídos. O processo de exclusão é assíncrono e pode levar até 24 horas para ser concluído.

Especifique uma chave para o manifesto a fim de ativar a criação de sessões de DVR. Você se refere a essa chave ao criar a sessão. Somente manifestos HLS são compatíveis.

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

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 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 projeto do Google Cloud, 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 com suporte.
    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, 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 teste 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:

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

Criar 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 em que o conteúdo será salvo. No exemplo de configuração do canal nesta página, essa chave está definida como manifest_hls.

É possível combinar várias seções de tempo da transmissão ao vivo em uma ú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"
    }
  }
]

Observe o seguinte:

  • Cada sessão de DVR precisa conter pelo menos um timeInterval em dvrWindows.
  • O campo dvrManifests.manifestKey precisa se referir a um manifesto HLS definido no canal pai da sessão do DVR. Se a solicitação de criação de sessão DVR for bem-sucedida, o URI do manifesto DVR gerado será retornado no campo dvrManifests.outputUri. Esse URI está no caminho especificado pelo campo outputUri do canal.
  • A matriz dvrManifests aceita apenas um manifesto por solicitação. Se você quiser gerar vários manifestos para os mesmos intervalos de DVR, divida os manifestos em várias sessões de DVR.
  • O conjunto de objetos timeInterval não pode se sobrepor e precisa estar em ordem cronológica. O startTime precisa ser anterior ao endTime em cada timeInterval.
  • startTime e endTime se referem à linha do tempo da transmissão ao vivo. Se o código de tempo incorporado estiver ativado para o manifesto, essa linha do tempo será baseada no código de tempo incorporado fornecido no stream de entrada e poderá ser diferente do relógio.
  • A duração total máxima da janela do DVR é de 24 horas.
  • O endTime do último timeInterval em dvrWindows pode ser deixado em branco. Nesse caso, o 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 período, incluindo os futuros. No entanto, o número de sessões de DVR com dvrWindows estendidas para um horário futuro é limitado a uma.
  • Não há limite no número de sessões de DVR em que todos os intervalos de DVR são estritamente anteriores.

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 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-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
  • DVR_SESSION_ID: um identificador definido pelo usuário para a sessão de DVR
  • INTERVAL_START_TIME: o horário da marcação da época Unix no manifesto original da transmissão ao vivo; usa um carimbo de data/hora no formato "Zulu" UTC RFC3339 (por exemplo, 2014-10-02T15:01:23Z).
  • INTERVAL_END_TIME: o horário da época Unix de marcação no manifesto original da transmissão ao vivo; usa um carimbo de data/hora no formato "Zulu" UTC RFC3339 (por exemplo, 2014-10-02T15:01:23Z).

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/dvrSessions/DVR_SESSION_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 Gerenciar operações de longa duração para mais informações.

Acessar a sessão de DVR

Para acessar uma sessão de DVR, use o método projects.locations.channels.dvrSessions.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 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-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
  • DVR_SESSION_ID: um identificador definido pelo usuário para a sessão de DVR

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/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 precisa conter um campo state que indique 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 de state para conferir a lista de estados e as descrições deles.

Verificar o conteúdo do bucket

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

  • Um manifesto de nível superior para a sessão de DVR com o mesmo nome do manifests.fileName especificado na configuração do canal (por exemplo, main.m3u8). É possível reproduzir esse manifesto usando um player de mídia on-line.
  • 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 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 Reproduzir.

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

Vídeo de teste do padrão

Eventos de intervalo de anúncio

Se você criou um evento de intervalo de anúncio para a transmissão ao vivo, a sessão de DVR contém os segmentos de anúncios conforme aparecem na transmissão ao vivo.