Esta página descreve como criar clipes de vídeo sob demanda (VOD) usando a API Live Stream. Os clipes de VOD são compostos por arquivos de manifesto HLS e arquivos de segmento salvos de uma transmissão ao vivo. Somente manifestos HLS são aceitos.
Diferenças entre clipes VOD e sessões de DVR
Os clipes VOD (também conhecidos como clipes de canal) são semelhantes às sessões de DVR, 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 sessões de DVR, consulte Criar uma sessão de DVR.
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 compatíveis.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 fluxo 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 renderização
de alta definição (1280x720).
Para ativar a criação de clipes VOD, 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 e o manifesto da transmissão ao vivo são retidos para criar clipes VOD. 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 de transmissão ao vivo e o arquivo de manifesto são excluídos automaticamente do Cloud Storage. O manifesto do clipe de VOD e os arquivos de segmento associados não são excluídos automaticamente. Não é possível criar clipes de VOD 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 permitir a criação de clipes de VOD. Você se refere a essa chave ao criar o clipe. Somente manifestos HLS são aceitos.
"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 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 um clipe de VOD
Para criar um clipe de VOD, use o
método projects.locations.channels.clips.create
.
Use o campo outputUri
para especificar o local em que os clipes e o arquivo de manifesto de clipes serão salvos no Cloud Storage. Você pode usar o mesmo
bucket criado para o manifesto da transmissão ao vivo ou um bucket diferente. Também é possível
anexar um nome de diretório ao nome do bucket (por exemplo,
my-bucket/vod-clip
).
Use o campo manifestKey
na matriz
clipManifests
para especificar o manifesto em que os clipes serão salvos. 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 um único clipe
adicionando objetos timeSlice
à matriz slices
.
"outputUri": "gs://my-bucket",
"clipManifests":[
{
"manifestKey": "manifest_hls"
}
],
"slices":[
{
"timeSlice": {
"markinTime": "2022-07-08T23:03:20.000Z",
"markoutTime": "2022-07-08T23:04:20.000Z"
}
},
{
"timeSlice": {
"markinTime": "2022-07-08T23:05:20.000Z",
"markoutTime": "2022-07-08T23:06:20.000Z"
}
}
]
Observe o seguinte:
- Cada clipe precisa conter pelo menos um
timeSlice
emslices
. - O campo
clipManifests.manifestKey
precisa se referir a um manifesto HLS definido no canal pai do clipe. Se a solicitação de criação do job de clipe for bem-sucedida, o URI do manifesto de clipe gerado será retornado no campoclipManifests.outputUri
. Esse URI está no caminho especificado pelo campooutputUri
do clipe. - A matriz
clipManifests
aceita apenas um manifesto por solicitação. Se você quiser gerar vários manifestos para o mesmo job de clipe, divida os manifestos em várias solicitações de job de clipe. - As fatias de clipe precisam ser homogêneas. Todos os elementos precisam ser do tipo
timeSlice
. - O conjunto de objetos
timeSlice
não pode se sobrepor e precisa estar em ordem cronológica. OmarkinTime
precisa ser anterior amarkoutTime
em cadatimeSlice
. - Se o
markinTime
mais recente de um clipe for anterior ao horário de início do canal ou ao início da janela de retenção, o horário de marcação será definido como o mais recente dos dois. - Se o último
markoutTime
de um clipe for posterior ao horário de término do canal, ele será definido como o horário de término do canal. Se o últimomarkoutTime
de um clipe for posterior ao horário do relógio do sistema atual, ele será definido como o horário em que a API realmente iniciar a tarefa de recorte. - A duração máxima de um clipe é de 24 horas.
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 canalCLIP_ID
: um identificador definido pelo usuário para o clipe de VODMARK_IN_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
).MARK_OUT_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
).BUCKET_NAME
: o nome do bucket do Cloud Storage criado para armazenar os arquivos de segmento e do manifesto do clipe de VOD. É possível usar o mesmo bucket criado para o manifesto da transmissão ao vivo ou um bucket diferente. Também é possível anexar um nome de diretório ao nome do bucket (por exemplo,my-bucket/vod-clip
).
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/clips/CLIP_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 o clipe de VOD
Para receber um clipe de VOD, use o método
projects.locations.channels.clips.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 canalCLIP_ID
: um identificador definido pelo usuário para o clipe de VOD
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/clips/CLIP_ID", "createTime": CREATE_TIME, "startTime": START_TIME, "updateTime": UPDATE_TIME, "state": "SUCCEEDED", "outputUri": "gs://BUCKET_NAME", "slices": [ { "timeSlice": { "markinTime": "MARK_IN_TIME", "markoutTime": "MARK_OUT_TIME" } } ], "features": {}, "clipManifests": [ { "manifestKey": "manifest_hls", "outputUri": "gs://BUCKET_NAME/main.m3u8" } ] }
O manifesto gerado está localizado no URI especificado no campo
clipManifests.outputUri
. O nome do arquivo
do manifesto é igual ao valor do campo
manifests.fileName
do canal pai.
A resposta precisa conter o seguinte:
{
...
"state": "SUCCEEDED"
...
}
Apenas os 1.000 registros de jobs de clipe mais recentes por canal estão disponíveis
usando o
método
projects.locations.channels.clips.get
. Todos os registros de jobs de clipe mais antigos que o limite são removidos. É necessário gerenciar os arquivos de clipe
gerados especificados pelo
outputUri
.
A API Live Stream não exclui esses arquivos do Cloud Storage.
Verificar o conteúdo do bucket
Abra o bucket do Cloud Storage conforme especificado no campo
outputUri
do clipe. Verifique se ele contém os seguintes arquivos e
diretórios:
- Um manifesto de nível superior para o clipe 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 diretório para cada
muxStreams.key
especificado no canal (por exemplo,mux_video_ts
)- Uma playlist para o clipe (por exemplo,
index-1.m3u8
) - Um diretório nomeado usando o formato
YYYYMMDDTHHMMSSZ
(por exemplo,20220708T203309Z/
). Esse diretório contém os segmentos de clipe de VOD- Vários arquivos
segment-number.ts
de segmento que compõem o clipe VOD
- Vários arquivos
- Uma playlist para o clipe (por exemplo,
Reproduzir o clipe do VOD
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 e de sinalização
Se você criou um evento de intervalo de anúncio para a transmissão ao vivo, os clipes de VOD não vão conter os anúncios. A API gera uma playlist com os limites de anúncios substituídos pelas seguintes tags:
#EXT-X-CUE-OUT: AD_BREAK_DURATION
#EXT-X-CUE-IN
As informações que aparecem no início ou no final do clipe de VOD são removidas automaticamente. As informações que aparecem na transmissão, cercadas pelo conteúdo da transmissão ao vivo, são mantidas no clipe de VOD gerado.