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 IAMLOCATION: a localização na qual criar o ponto final de entrada; use uma das regiões suportadasMostrar localizaçõesus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-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 IAMLOCATION: a localização onde o seu ponto final de entrada está localizado; use uma das regiões suportadasMostrar localizaçõesus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-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 IAMLOCATION: a localização na qual criar o canal; use uma das regiões suportadasMostrar localizaçõesus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-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 carateresINPUT_ID: o identificador definido pelo utilizador para o ponto final de entradaBUCKET_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 IAMLOCATION: a localização onde o seu canal está localizado; use uma das regiões suportadasMostrar localizaçõesus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-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
timeIntervalemdvrWindows. - O campo
dvrManifests.manifestKeytem 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 campodvrManifests.outputUri. Este URI encontra-se no caminho especificado pelo campooutputUrido canal. - A matriz
dvrManifestssó 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
timeIntervalnão pode ter sobreposições e tem de estar por ordem cronológica. OstartTimetem de ser anterior aoendTimeem todos ostimeInterval. startTimeeendTimereferem-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
endTimedo últimotimeIntervalemdvrWindowspode ser deixado em branco. Neste caso, o valor deendTimeé 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
dvrWindowsextensã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 IAMLOCATION: a localização onde o seu canal está localizado; use uma das regiões suportadasMostrar localizaçõesus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: um identificador definido pelo utilizador para o canalDVR_SESSION_ID: um identificador definido pelo utilizador para a sessão de DVRINTERVAL_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 IAMLOCATION: a localização onde o seu canal está localizado; use uma das regiões suportadasMostrar localizaçõesus-central1us-east1us-east4us-west1us-west2northamerica-northeast1southamerica-east1asia-east1asia-east2asia-south1asia-northeast1asia-southeast1australia-southeast1europe-north1europe-west1europe-west2europe-west3europe-west4
CHANNEL_ID: um identificador definido pelo utilizador para o canalDVR_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.fileNameespecificado 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.keyespecificado 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:
- Torne o contentor do Cloud Storage que criou publicamente legível.
- Para ativar a partilha de recursos de origem cruzada (CORS) num contentor do Cloud Storage, faça o seguinte:
- Crie um ficheiro JSON que contenha o seguinte:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ] -
Execute o seguinte comando depois de substituir
JSON_FILE_NAMEpelo nome do ficheiro JSON que criou no passo anterior:gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Crie um ficheiro JSON que contenha o seguinte:
- No contentor do Cloud Storage, encontre o ficheiro gerado. Clique em Copiar URL na coluna Acesso público do ficheiro.
- Navegue para Shaka Player, um leitor de streams em direto online.
- Clique em Conteúdo personalizado na barra de navegação superior.
- Clique no botão +.
Cole o URL público do ficheiro na caixa URL do manifesto.

Introduza um nome na caixa Nome.
Clique em Guardar.
Clique em Jogar.
Deve ver um padrão de teste a ser reproduzido como stream em direto.
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.