Esta página descreve como criar clipes de vídeo sob demanda (VOD) de uma transmissão ao vivo 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.
Configurar o projeto e a autenticação do Google Cloud
Se você ainda não criou projeto e credenciais do Google Cloud, 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
: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAMLOCATION
: o local em que a entrada será criada. endpoint; usar 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-northeast1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west3
europe-west4
INPUT_ID
: um identificador definido pelo usuário para a nova entrada. endpoint a ser criado (para onde você enviará o fluxo 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 sua solicitação. Consulte Gerenciar operações de longa duração para mais informações.
Receber detalhes do endpoint de entrada
Para obter 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-northeast1
asia-southeast1
australia-southeast1
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 para usar mais tarde
na seção Enviar o fluxo de entrada.
Criar um canal
Para criar um canal, use o
projects.locations.channels.create
. Os exemplos a seguir criam um canal que gera um HLS ao vivo
riacho. A transmissão ao vivo consiste em um único vídeo em alta definição (1280 x 720)
versão.
Para ativar a criação de clipes VOD, adicione o
objeto retentionConfig
à configuração do canal.
"retentionConfig": {
"retentionWindowDuration": {
"seconds": 86400
}
},
Quando a retenção está ativada para um canal de transmissão ao vivo, o segmento e o manifesto
são retidos para criar clipes VOD. O objeto
retentionWindowDuration
especifica o
tempo de armazenamento da saída da transmissão ao vivo depois do 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 expirar, o segmento será excluído automaticamente do
Cloud Storage. Não é possível criar clipes 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 do manifesto para ativar a criação de clipes VOD. Você se refere a isso na hora de criar o clipe. Só há suporte para manifestos HLS.
"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; usar 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-northeast1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: um identificador definido pelo usuário para o canal. criar, esse valor precisa ter de 1 a 63 caracteres, começar e terminar com[a-z0-9]
; pode conter traços (-) entre os caracteresINPUT_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 Gerencie 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
: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAMLOCATION
: o local em que seu canal está localizado. 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-northeast1
asia-southeast1
australia-southeast1
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 do 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 o arquivo será salvo.
o arquivo de manifesto de clipes e clipes no Cloud Storage. Você pode usar o mesmo
bucket criado para o manifesto da transmissão ao vivo ou um bucket diferente. Você pode
também 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 de onde salvar os clipes. No exemplo de configuração do canal nesta página, essa
chave está definida como manifest_hls
.
Você pode 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 deve conter pelo menos um
timeSlice
naslices
- O campo
clipManifests.manifestKey
precisa se referir a um manifesto HLS definido no canal pai do clipe. Se a criação do job de clipe for bem-sucedida, o URI do manifesto de clipe gerado será retornado em no campoclipManifests.outputUri
. Esse URI está no caminho especificado pelo campooutputUri
do clipe. - A matriz
clipManifests
aceita apenas um manifesto por solicitação. Se quiser gerar vários manifestos para o mesmo job de clipe, você precisa dividir 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 a amarkoutTime
em cadatimeSlice
. - Se o último
markinTime
de um clipe for anterior ao o horário de início do canal ou o início da janela de retenção, depois a marcação é definido como o último 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
: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAMLOCATION
: 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-northeast1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: um identificador definido pelo usuário para o canal.CLIP_ID
: um identificador definido pelo usuário para o clipe VOD.MARK_IN_TIME
: o horário da época Unix de marcação em o manifesto original da transmissão ao vivo; usa um carimbo de data/hora em RFC3339 UTC "Zulu" formato (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 em RFC3339 UTC "Zulu" formato (para exemplo:2014-10-02T15:01:23Z
)BUCKET_NAME
: o nome do Cloud Storage. bucket que você criou para armazenar o manifesto de clipes VOD e os arquivos de segmento é possível usar o mesmo bucket que você criou para o manifesto de transmissão ao vivo ou para um bucket diferente. também é possível anexar um 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 sua solicitação. Consulte Gerencie operações de longa duração para mais informações.
Baixar o clipe 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
: seu projeto do Google Cloud número; ele está localizado no campo Número do projeto da Página Configurações do IAMLOCATION
: o local onde seu canal está. localizada; usar 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-northeast1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west3
europe-west4
CHANNEL_ID
: um identificador definido pelo usuário para o canal.CLIP_ID
: um identificador definido pelo usuário para o clipe 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
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 clipes anteriores ao limite são removidos. Você precisa gerenciar o clipe gerado
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 arquivo
outputUri
. 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 no canal configuração (por exemplo,main.m3u8
); você pode 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,
Assistir o clipe 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 Jogar.
Você verá um padrão de teste sendo transmitido como transmissão ao vivo.
Eventos de intervalo de anúncio e de barreira
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 barreiras que aparecem no início ou no fim do clipe VOD são automaticamente removida. Barreiras que aparecem dentro da transmissão, cercadas pela transmissão ao vivo são retidos no clipe VOD gerado.