Nesta página, explicamos como adicionar legendas descritivas e legendas a um vídeo de saída.
As closed captions (ou apenas legendas) são a exibição visual do áudio em um vídeo. As closed captions geralmente estão no mesmo idioma do áudio e incluem sons de plano de fundo e mudanças de orador.
As legendas geralmente são usadas para traduzir o diálogo de um vídeo para outro idioma. As legendas geralmente não incluem sons de fundo e mudanças de orador.
Esta página usa o termo arquivo de legenda de entrada para se referir a um arquivo de texto que contém legendas ou closed captions. Você fornece esse arquivo como entrada para um job.
Adicionar legendas e closed captions a uma configuração de job
Consulte as entradas e saídas compatíveis para saber quais são os formatos de arquivo de legenda de entrada aceitos. Um arquivo de vídeo de exemplo e arquivos de legenda de entrada de exemplo são fornecidos para você testar a configuração.
Use as informações nas seções a seguir para adicionar legendas e legendas descritivas a uma configuração de job. Esta página pressupõe que você esteja familiarizado com uma JobConfig básica. Para mais informações sobre como criar jobs de transcodificação, consulte Criar e gerenciar jobs.
Adicionar legendas
Para criar um job que incorpora legendas no contêiner do arquivo de vídeo de saída, faça o seguinte:
Adicione uma matriz
inputs
ao início da configuração do job.Adicione um objeto
Input
à matrizinputs
que define a chave e o URI do vídeo de entrada associado.Adicione outro objeto
Input
que inclua o caminho para o arquivo de legenda de entrada.Adicione uma matriz
editList
à configuração do job. Essa matriz é usada para adicionar entradas à linha do tempo do vídeo de saída.Adicione um objeto
EditAtom
à matrizeditList
. Esse objetoEditAtom
precisa referenciar as chaves do vídeo de entrada e das legendas que você adicionou na matrizinputs
. É possível designar umstartTimeOffset
eendTimeOffset
para cortar o vídeo de entrada.Adicione as legendas aos contêineres de saída adicionando um objeto
textStream
à matrizelementaryStreams
. Apenas um stream de texto incorporado é aceito e adicionado a todos os vídeos de saída, já que há apenas uma linha do tempo de saída.Use a matriz
mapping
no objeto de configuraçãotextStream
para referenciar a chave de objetoEditAtom
.
O exemplo de configuração a seguir incorpora legendas ocultas CEA-608 em um vídeo.
É possível adicionar essa configuração a um modelo de job ou incluí-la em uma configuração de job ad-hoc:
REST
Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:
PROJECT_ID
: o ID do Google Cloud projeto listado nas Configurações do IAM.LOCATION
: o local onde seu job será executado. Use uma das regiões com suporte.Mostrar locaisus-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: o nome do bucket do Cloud Storage criado.STORAGE_INPUT_VIDEO
: o nome do vídeo no bucket do Cloud Storage que você está transcodificando, comomy-vid.mp4
. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/my-vid.mp4
).STORAGE_CAPTIONS_FILE
: o nome de um arquivo de legendas no bucket do Cloud Storage, comocaptions.srt
. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/captions.srt
).STORAGE_OUTPUT_FOLDER
: o nome da pasta de saída no bucket do Cloud Storage em que você quer salvar as saídas de vídeo codificadas.
Para enviar a solicitação, expanda uma destas opções:
Você receberá uma resposta JSON semelhante a esta:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
gcloud
Antes de usar os dados do comando abaixo, faça estas substituições:
LOCATION
: o local onde seu job será executado. Use uma das regiões com suporte.Mostrar locaisus-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: o nome do bucket do Cloud Storage criado.STORAGE_INPUT_VIDEO
: o nome do vídeo no bucket do Cloud Storage que você está transcodificando, comomy-vid.mp4
. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/my-vid.mp4
).STORAGE_CAPTIONS_FILE
: o nome de um arquivo de legendas no bucket do Cloud Storage, comocaptions.srt
. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/captions.srt
).STORAGE_OUTPUT_FOLDER
: o nome da pasta de saída no bucket do Cloud Storage em que você quer salvar as saídas de vídeo codificadas.
Salve o conteúdo a seguir em um arquivo chamado request.json
:
{ "config": { "inputs": [ { "key": "input0", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO" }, { "key": "caption_input0", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_CAPTIONS_FILE" } ], "editList": [ { "key": "atom0", "inputs": [ "input0", "caption_input0" ] } ], "elementaryStreams": [ { "key": "video-stream0", "videoStream": { "h264": { "heightPixels": 360, "widthPixels": 640, "bitrateBps": 550000, "frameRate": 60 } } }, { "key": "audio-stream0", "audioStream": { "codec": "aac", "bitrateBps": 64000 } }, { "key": "cea-stream0", "textStream": { "codec": "cea608", "mapping": [ { "atomKey": "atom0", "inputKey": "caption_input0", "inputTrack": 0 } ], "languageCode": "en-US", "displayName": "English" } } ], "muxStreams": [ { "key": "sd-hls", "container": "ts", "elementaryStreams": [ "video-stream0", "audio-stream0" ] }, { "key": "sd-dash", "container": "fmp4", "elementaryStreams": [ "video-stream0" ] }, { "key": "audio-dash", "container": "fmp4", "elementaryStreams": [ "audio-stream0" ] } ], "manifests": [ { "fileName": "manifest.m3u8", "type": "HLS", "muxStreams": [ "sd-hls" ] }, { "fileName": "manifest.mpd", "type": "DASH", "muxStreams": [ "sd-dash", "audio-dash" ] } ], "output": { "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/" } } }
Execute o seguinte comando:
Linux, macOS ou Cloud Shell
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (PowerShell)
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (cmd.exe)
gcloud transcoder jobs create --location=LOCATION --file=request.json
Você receberá uma resposta semelhante a esta:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
Go
Antes de testar esta amostra, siga as instruções de configuração do Go no Guia de início rápido da API Transcoder: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Transcoder Go.
Para autenticar na API Transcoder, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Java
Antes de testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido da API Transcoder: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Transcoder Java.
Para autenticar na API Transcoder, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Node.js
Antes de testar esta amostra, siga as instruções de configuração do Node.js no Guia de início rápido da API Transcoder: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Transcoder Node.js.
Para autenticar na API Transcoder, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Python
Antes de testar esta amostra, siga as instruções de configuração do Python no Guia de início rápido da API Transcoder: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Transcoder Python.
Para autenticar na API Transcoder, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Adicionar legendas
Para criar um job que produz arquivos de legenda em vários idiomas reproduzidos em um manifesto, faça o seguinte:
Adicione uma matriz
inputs
à configuração do job.Adicione um objeto
Input
à matrizinputs
que define a chave e o URI do vídeo de entrada associado.Adicione outro objeto
Input
que defina o URI do arquivo de legenda de entrada.Adicione uma matriz
editList
à configuração. Essa matriz é usada para adicionar as entradas à linha do tempo do vídeo de saída.Adicione um objeto
EditAtom
à matrizeditList
que faz referência aos objetos na matrizinputs
por chave. É possível designar umstartTimeOffset
eendTimeOffset
para cortar o vídeo de entrada.Adicione as legendas aos contêineres de saída adicionando um objeto
textStream
à matrizelementaryStreams
.Para o arquivo de legenda independente, especifique o contêiner na matriz
muxStream
. Confira os objetos com as chavestext-vtt-en
etext-vtt-es
na configuração a seguir. Para legendas incorporadas, você só precisa do fluxo elementar.
A configuração a seguir gera vários arquivos WebVTT, um para legendas em inglês e outro para legendas em espanhol. As legendas DASH em arquivos WebVTT são criadas no formato de contêiner fMP4.
É possível adicionar essa configuração a um modelo de job ou incluí-la em uma configuração de job ad-hoc:
REST
Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:
PROJECT_ID
: o ID do Google Cloud projeto listado nas Configurações do IAM.LOCATION
: o local onde seu job será executado. Use uma das regiões com suporte.Mostrar locaisus-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: o nome do bucket do Cloud Storage criado.STORAGE_INPUT_VIDEO
: o nome do vídeo no bucket do Cloud Storage que você está transcodificando, comomy-vid.mp4
. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/my-vid.mp4
).STORAGE_SUBTITLES_FILE1
: o nome do arquivo de legendas no bucket do Cloud Storage, comosubtitles-en.srt
para legendas em inglês. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/subtitles-en.srt
).STORAGE_SUBTITLES_FILE2
: o nome de outro arquivo de legendas no bucket do Cloud Storage, comosubtitles-es.srt
para legendas em espanhol. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/subtitles-es.srt
).STORAGE_OUTPUT_FOLDER
: o nome da pasta de saída no bucket do Cloud Storage em que você quer salvar as saídas de vídeo codificadas.
Para enviar a solicitação, expanda uma destas opções:
Você receberá uma resposta JSON semelhante a esta:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
gcloud
Antes de usar os dados do comando abaixo, faça estas substituições:
LOCATION
: o local onde seu job será executado. Use uma das regiões com suporte.Mostrar locaisus-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
northamerica-northeast1
asia-east1
asia-northeast1
asia-northeast3
asia-south1
asia-southeast1
australia-southeast1
europe-west1
europe-west2
europe-west4
STORAGE_BUCKET_NAME
: o nome do bucket do Cloud Storage criado.STORAGE_INPUT_VIDEO
: o nome do vídeo no bucket do Cloud Storage que você está transcodificando, comomy-vid.mp4
. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/my-vid.mp4
).STORAGE_SUBTITLES_FILE1
: o nome do arquivo de legendas no bucket do Cloud Storage, comosubtitles-en.srt
para legendas em inglês. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/subtitles-en.srt
).STORAGE_SUBTITLES_FILE2
: o nome de outro arquivo de legendas no bucket do Cloud Storage, comosubtitles-es.srt
para legendas em espanhol. Este campo precisa considerar todas as pastas criadas no bucket (por exemplo,input/subtitles-es.srt
).STORAGE_OUTPUT_FOLDER
: o nome da pasta de saída no bucket do Cloud Storage em que você quer salvar as saídas de vídeo codificadas.
Salve o conteúdo a seguir em um arquivo chamado request.json
:
{ "config": { "inputs": [ { "key": "input0", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_INPUT_VIDEO" }, { "key": "subtitle_input_en", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_SUBTITLES_FILE1" }, { "key": "subtitle_input_es", "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_SUBTITLES_FILE2" } ], "editList": [ { "key": "atom0", "inputs": [ "input0", "subtitle_input_en", "subtitle_input_es" ] } ], "elementaryStreams": [ { "key": "video-stream0", "videoStream": { "h264": { "heightPixels": 360, "widthPixels": 640, "bitrateBps": 550000, "frameRate": 60 } } }, { "key": "audio-stream0", "audioStream": { "codec": "aac", "bitrateBps": 64000 } }, { "key": "vtt-stream-en", "textStream": { "codec": "webvtt", "languageCode": "en-US", "displayName": "English", "mapping": [ { "atomKey": "atom0", "inputKey": "subtitle_input_en" } ] } }, { "key": "vtt-stream-es", "textStream": { "codec": "webvtt", "languageCode": "es-ES", "displayName": "Spanish", "mapping": [ { "atomKey": "atom0", "inputKey": "subtitle_input_es" } ] } } ], "muxStreams": [ { "key": "sd-hls-fmp4", "container": "fmp4", "elementaryStreams": [ "video-stream0" ] }, { "key": "audio-hls-fmp4", "container": "fmp4", "elementaryStreams": [ "audio-stream0" ] }, { "key": "text-vtt-en", "container": "vtt", "elementaryStreams": [ "vtt-stream-en" ], "segmentSettings": { "segmentDuration": "6s", "individualSegments": true } }, { "key": "text-vtt-es", "container": "vtt", "elementaryStreams": [ "vtt-stream-es" ], "segmentSettings": { "segmentDuration": "6s", "individualSegments": true } } ], "manifests": [ { "fileName": "manifest.m3u8", "type": "HLS", "muxStreams": [ "sd-hls-fmp4", "audio-hls-fmp4", "text-vtt-en", "text-vtt-es" ] } ], "output": { "uri": "gs://STORAGE_BUCKET_NAME/STORAGE_OUTPUT_FOLDER/" } } }
Execute o seguinte comando:
Linux, macOS ou Cloud Shell
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (PowerShell)
gcloud transcoder jobs create --location=LOCATION --file=request.json
Windows (cmd.exe)
gcloud transcoder jobs create --location=LOCATION --file=request.json
Você receberá uma resposta semelhante a esta:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
Go
Antes de testar esta amostra, siga as instruções de configuração do Go no Guia de início rápido da API Transcoder: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Transcoder Go.
Para autenticar na API Transcoder, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Java
Antes de testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido da API Transcoder: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Transcoder Java.
Para autenticar na API Transcoder, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Node.js
Antes de testar esta amostra, siga as instruções de configuração do Node.js no Guia de início rápido da API Transcoder: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Transcoder Node.js.
Para autenticar na API Transcoder, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Python
Antes de testar esta amostra, siga as instruções de configuração do Python no Guia de início rápido da API Transcoder: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Transcoder Python.
Para autenticar na API Transcoder, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Assistir o vídeo
Para ver as legendas no Windows, reproduza o vídeo no app Filmes e TV. Selecione a faixa de legendas.
Para ver as legendas no macOS ou Linux, reproduza o vídeo no Shaka Player. Ative as legendas no menu Captions.
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://STORAGE_BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Crie um arquivo JSON que contenha o seguinte:
- Escolha um dos arquivos MP4 ou de manifesto gerados pelo job de transcodificação no bucket do Cloud Storage. 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.
Selecione o botão de reticências no canto inferior direito do player e ative as legendas.
Exemplo
É possível usar os seguintes arquivos para um job de teste:
- Exemplo de vídeo de entrada
- Exemplo de arquivo de entrada de legendas para legendas descritivas
- Exemplo de arquivo de legenda de entrada para legendas em inglês
- Exemplo de arquivo de legenda de entrada para legendas em espanhol
O arquivo de legenda de entrada não pode conter linhas em branco entre as linhas de texto.