Esta página explica como adicionar legendas ocultas e legendas 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 legendas geralmente estão no mesmo idioma que o áudio e incluem sons de fundo e mudanças de locutor.
Legendas normalmente são usadas para traduzir os diálogos de um vídeo para um idioma diferente. Os subtítulos geralmente não incluem sons de fundo e mudanças no alto-falante.
Nesta página, o termo arquivo de legenda de entrada é usado para se referir a um arquivo de texto que contém closed captions ou legendas. Você fornece esse arquivo como entrada para um job.
Adicionar legendas à configuração de um job
Consulte as entradas e saídas compatíveis para ver os formatos de arquivo de legenda de entrada compatíveis. Um arquivo de vídeo de exemplo e arquivos de legenda de entrada de exemplo são fornecidos para você testar sua configuração.
Use as informações nas seções a seguir para adicionar legendas à configuração de um job. Nesta página, você precisa estar familiarizado com o básico do JobConfig. 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 ao 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 fazer referência às chaves do vídeo de entrada e às legendas que você adicionou à matrizinputs
. Você pode designarstartTimeOffset
eendTimeOffset
para cortar o vídeo de entrada.Adicione as legendas aos contêineres de saída incluindo um objeto
textStream
à matrizelementaryStreams
. Só há suporte para um fluxo de texto incorporado e ele é 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 fazer referência à chave do objetoEditAtom
.
O exemplo de configuração a seguir incorpora legendas 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:
Adicionar legendas
Para criar um job que produza 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 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 faz referência aos objetos na matrizinputs
por chave. Você pode designarstartTimeOffset
eendTimeOffset
para cortar o vídeo de entrada.Adicione as legendas aos contêineres de saída incluindo um objeto
textStream
à matrizelementaryStreams
.Para o arquivo de legenda independente, 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 IAMLOCATION
: 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
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, 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 seu 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
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, 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 seu 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 de 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.
Para autenticar a 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 de 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.
Para autenticar a 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 de 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.
Para autenticar a 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 de 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.
Para autenticar a 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, abra 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 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 criado 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 Salvar.
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 em um job de teste:
- Exemplo de vídeo de entrada
- Exemplo de arquivo de legenda de entrada para legendas
- 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.