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 locaisus-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 locaisus-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 locaisus-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 entradaBUCKET_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 locaisus-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
emdvrWindows
. - 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 campodvrManifests.outputUri
. Esse URI está no caminho especificado pelo campooutputUri
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. OstartTime
precisa ser anterior aoendTime
em cadatimeInterval
. startTime
eendTime
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 últimotimeInterval
emdvrWindows
pode ser deixado em branco. Nesse caso, oendTime
é 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 locaisus-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 canalDVR_SESSION_ID
: um identificador definido pelo usuário para a sessão de DVRINTERVAL_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 locaisus-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 canalDVR_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:
- Torne o bucket do Cloud Storage criado publicamente legível.
- Para ativar o compartilhamento de recursos entre origens
(CORS, na sigla em inglês) em um bucket do Cloud Storage, faça o seguinte:
- Crie um arquivo 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 arquivo JSON criado na etapa anterior:gcloud storage buckets update gs://BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Crie um arquivo JSON que contenha o seguinte:
- No bucket do Cloud Storage, encontre o arquivo gerado. Clique em Copiar URL na coluna Acesso público do arquivo.
- Acesse o Shaka Player, um player de transmissão ao vivo on-line.
- Clique em Conteúdo personalizado na barra de navegação superior.
- Clique no botão +.
Cole o URL público do arquivo na caixa URL do manifesto.
Digite um nome na caixa Nome.
Clique em Salvar.
Clique em Reproduzir.
Você verá um padrão de teste sendo transmitido como transmissão ao vivo.
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.