Nesta página, explicamos como adicionar legendas e closed captions a um vídeo de saída.
As legendas (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 fundo e mudanças de locutor.
Legendas normalmente são usadas para traduzir o diálogo de um vídeo para um idioma diferente. As legendas geralmente não incluem sons de fundo e mudanças nos alto-falantes.
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 uma entrada para um job.
Adicionar legendas e legendas ocultas a uma configuração de job
Consulte as entradas e saídas aceitas para ver os formatos de arquivo de legenda de entrada compatíveis. Um arquivo de amostra e um arquivo de legenda de entrada de amostra são fornecidos para você testar a configuração.
Use as informações nas seções a seguir para adicionar legendas às configurações de um job. Nesta página, presumimos que você conhece um JobConfig básico. Para mais informações sobre como criar jobs de transcodificação, consulte Como criar e gerenciar jobs.
Adicionar as legendas ocultas
Para criar um job que incorpore legendas no contêiner de 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 fazer referência às chaves do vídeo de entrada e das legendas adicionadas na matrizinputs
. É possível designar umstartTimeOffset
e umendTimeOffset
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 é compatível e adicionado a todos os vídeos de saída, já que há apenas um cronograma de saída.Use a matriz
mapping
no objeto de configuraçãotextStream
para fazer referência à chave do 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, faça as substituições a seguir:
- PROJECT_ID: o ID do projeto do Google Cloud listado nas Configurações do IAM
- LOCATION: o local onde seu job será executado. Use
uma das regiões compatíveis:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-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, como
my-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, como
captions.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.
Solicitar corpo 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/" } } }
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 CLI
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 compatíveis:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-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, como
my-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, como
captions.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 usando bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Go da API Transcoder.
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 usando bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Java da API Transcoder.
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 usando bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Node.js da API Transcoder.
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 usando bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Python da API Transcoder.
Adicionar legendas
Para criar um job que produza arquivos de legendas em vários idiomas reproduzidos de 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 para o 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 faça referência aos objetos na matrizinputs
por chave. É possível designar umstartTimeOffset
e umendTimeOffset
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 autônomo, especifique o contêiner na matriz
muxStream
. Consulte os objetos com as chavestext-vtt-en
etext-vtt-es
na configuração a seguir. Para legendas incorporadas, você só precisa do fluxo básico.
A configuração a seguir gera vários arquivos WebVTT, um para legendas em inglês e outro para legendas em espanhol.
É 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, faça as substituições a seguir:
- PROJECT_ID: o ID do projeto do Google Cloud listado nas Configurações do IAM
- LOCATION: o local onde seu job será executado. Use
uma das regiões compatíveis:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-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, como
my-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 seu bucket do Cloud Storage, como
subtitles-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 seu bucket do Cloud Storage, como
subtitles-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.
Solicitar corpo 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/" } } }
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 CLI
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 compatíveis:
us-central1
us-west1
us-west2
us-east1
us-east4
southamerica-east1
asia-east1
asia-south1
asia-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, como
my-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 seu bucket do Cloud Storage, como
subtitles-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 seu bucket do Cloud Storage, como
subtitles-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 usando bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Go da API Transcoder.
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 usando bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Java da API Transcoder.
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 usando bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Node.js da API Transcoder.
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 usando bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Python da API Transcoder.
Assistir o vídeo
Para ver as legendas no Windows, abra o vídeo no app Filmes e TV. Selecione a faixa de legendas.
Para ver as legendas no MacOS ou Linux, abra o vídeo no Shaka Player. Ative as legendas no menu Legendas.
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) 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 que você criou na etapa anterior:
gsutil cors set JSON_FILE_NAME.json gs://STORAGE_BUCKET_NAME
- 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 Save.
Clique em Jogar
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 legenda de entrada para closed captions
- 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.