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-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 IAMLOCATION
: a localização onde o seu ponto final de entrada está localizado; use uma das regiões suportadasMostrar localizaçõesus-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 IAMLOCATION
: a localização na qual criar o canal; use uma das regiões suportadasMostrar localizaçõesus-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 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-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
emdvrWindows
. - 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 campodvrManifests.outputUri
. Este URI encontra-se no caminho especificado pelo campooutputUri
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. OstartTime
tem de ser anterior aoendTime
em todos ostimeInterval
. startTime
eendTime
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 últimotimeInterval
emdvrWindows
pode 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
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 IAMLOCATION
: a localização onde o seu canal está localizado; use uma das regiões suportadasMostrar localizaçõesus-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 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-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 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.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:
- 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_NAME
pelo 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.