En esta página, se explica cómo agregar subtítulos a un video de salida.
Los subtítulos (o solo subtítulos) son la representación visual del audio de un video. Por lo general, los subtítulos están en el mismo idioma que el audio y, además, incluyen sonidos de fondo y cambios de orador.
Los subtítulos suelen usarse para traducir el diálogo de un video a un idioma diferente. Por lo general, los subtítulos no incluyen sonidos de fondo ni cambios de interlocutor.
En esta página, se usa el término archivo de subtítulos de entrada para referirse a un archivo de texto que contiene subtítulos. Proporcionas este archivo como entrada a un trabajo.
Agregar subtítulos a una configuración de trabajo
Consulta las entradas y salidas admitidas para conocer los formatos de archivo de subtítulos de entrada compatibles. Un archivo de video de muestra y archivos de subtítulos de entrada de muestra para que pruebes la configuración.
Usa la información de las siguientes secciones para agregar subtítulos a un trabajo. configuración. En esta página, se da por sentado que conoces JobConfig. Para obtener más información sobre cómo crear trabajos de transcodificación, consulta Cómo crear y administrar trabajos.
Cómo agregar subtítulos
Para crear un trabajo que incorpore subtítulos en el contenedor del archivo de video de salida, haz lo siguiente: lo siguiente:
Agrega un array
inputs
al comienzo de la configuración del trabajo.Agrega un objeto
Input
al arrayinputs
que defina la clave y el URI del video de entrada asociado.Agrega otro objeto
Input
que incluya la ruta de acceso al archivo de subtítulos de entrada.Agrega un array
editList
a la configuración del trabajo. Este array se usa para agregar entradas al línea de tiempo de salida de video.Agrega un objeto
EditAtom
al arrayeditList
. Esta ObjetoEditAtom
debe hacer referencia a las teclas del video de entrada y los subtítulos que agregaste en la Arrayinputs
. Puedes designar unstartTimeOffset
y unendTimeOffset
como cortar el video de entrada.Agrega los subtítulos a los contenedores de salida agregando un objeto
textStream
al arrayelementaryStreams
. Solo se admite una transmisión de texto incorporada, que se agrega a todos los videos de salida (ya que solo hay una línea de tiempo de salida).Usa el
mapping
en latextStream
de configuración para hacer referencia al objetoEditAtom
.
El siguiente ejemplo de configuración incorpora subtítulos CEA-608 en un video.
Puedes agregar esta configuración a una plantilla de trabajo o incluirla en una configuración de trabajo ad-hoc:
Agregar subtítulos
Para crear un trabajo que produzca archivos de subtítulos en varios idiomas reproducidos desde un manifiesto, haz lo siguiente: haz lo siguiente:
Agrega un array
inputs
a la configuración del trabajo.Agrega un objeto
Input
al arrayinputs
que defina la clave y el URI del video de entrada asociado.Agregar otra
Input
que define el URI para el archivo de subtítulos de entrada.Agrega un array
editList
a la configuración. Este array se usa para agregar las entradas a la línea de tiempo del video de salida.Agrega un objeto
EditAtom
al arrayeditList
que haga referencia a los objetos del arrayinputs
por clave. Puedes designar unstartTimeOffset
y unendTimeOffset
como cortar el video de entrada.Agrega los subtítulos a los contenedores de salida agregando un objeto
textStream
al arrayelementaryStreams
.Para el archivo de subtítulos independiente, especifica el contenedor en la
muxStream
array; consulta los objetos con clavestext-vtt-en
ytext-vtt-es
en la siguiente configuración. En el caso de los subtítulos incorporados, solo necesitas los de flujo elemental.
La siguiente configuración genera varios archivos WebVTT, uno para inglés y otra para subtítulos en español. Los subtítulos DASH en archivos WebVTT son crearse en el formato de contenedor fMP4.
Puedes agregar esta configuración a una plantilla de trabajo o incluirla en una configuración de trabajo ad-hoc:
REST
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
PROJECT_ID
: El ID de tu proyecto de Google Cloud que aparece en Configuración de IAM.LOCATION
: Es la ubicación en la que se ejecutará tu trabajo. Usa una de las regiones compatibles.Cómo mostrar ubicacionesus-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
: Es el nombre del bucket de Cloud Storage que creaste.STORAGE_INPUT_VIDEO
: Es el nombre de un video en tu bucket de Cloud Storage que transcodificarás, comomy-vid.mp4
. Este campo debe representar todas las carpetas que creaste en el bucket (por ejemplo,input/my-vid.mp4
).STORAGE_SUBTITLES_FILE1
: Es el nombre del archivo de subtítulos en tu bucket de Cloud Storage, comosubtitles-en.srt
para los subtítulos en inglés. Este campo debe representar todas las carpetas que creaste en el bucket (por ejemplo,input/subtitles-en.srt
).STORAGE_SUBTITLES_FILE2
: Es el nombre de otro archivo de subtítulos en tu bucket de Cloud Storage, comosubtitles-es.srt
para subtítulos en español. Este campo debe tener en cuenta todas las carpetas que hayas creado en la bucket (por ejemplo,input/subtitles-es.srt
).STORAGE_OUTPUT_FOLDER
: Es el nombre de la carpeta de salida en tu bucket de Cloud Storage en la que deseas guardar los resultados del video codificado.
Para enviar tu solicitud, expande una de estas opciones:
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
gcloud
Antes de usar cualquiera de los datos de comando a continuación, realiza los siguientes reemplazos:
LOCATION
: Es la ubicación en la que se ejecutará tu trabajo. Usa una de las regiones compatibles.Cómo mostrar ubicacionesus-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
: Es el nombre del bucket de Cloud Storage que creaste.STORAGE_INPUT_VIDEO
: Es el nombre de un video en tu bucket de Cloud Storage que transcodificarás, comomy-vid.mp4
. Este campo debe representar todas las carpetas que creaste en el bucket (por ejemplo,input/my-vid.mp4
).STORAGE_SUBTITLES_FILE1
: Es el nombre del archivo de subtítulos en tu bucket de Cloud Storage, comosubtitles-en.srt
para los subtítulos en inglés. Este campo debe representar todas las carpetas que creaste en el bucket (por ejemplo,input/subtitles-en.srt
).STORAGE_SUBTITLES_FILE2
: Es el nombre de otro archivo de subtítulos en tu bucket de Cloud Storage, comosubtitles-es.srt
para subtítulos en español. Este campo debe tener en cuenta todas las carpetas que hayas creado en la bucket (por ejemplo,input/subtitles-es.srt
).STORAGE_OUTPUT_FOLDER
: Es el nombre de la carpeta de salida en tu bucket de Cloud Storage en la que deseas guardar los resultados del video codificado.
Guarda el siguiente código en un archivo llamado 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/" } } }
Ejecuta el siguiente comando:
Linux, macOS o 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
Deberías recibir una respuesta similar a la que figura a continuación:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
Go
Antes de probar esta muestra, sigue las instrucciones de configuración de Go que se encuentran en el Guía de inicio rápido de la API de Transcoder con bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Go de la API de Transcoder.
Para autenticarte en la API de Transcoder, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Java
Antes de probar esta muestra, sigue las instrucciones de configuración de Java que se encuentran en la Guía de inicio rápido de la API de Transcoder para usar bibliotecas cliente. Para obtener más información, consulta la API de Java de la API de Transcoder documentación de referencia.
Para autenticarte en la API de Transcoder, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Node.js
Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js que se encuentran en el Guía de inicio rápido de la API de Transcoder con bibliotecas cliente. Para obtener más información, consulta la API de Node.js de la API de Transcoder documentación de referencia.
Para autenticarte en la API de Transcoder, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Python
Antes de probar esta muestra, sigue las instrucciones de configuración de Python que se encuentran en el Guía de inicio rápido de la API de Transcoder con bibliotecas cliente. Para obtener más información, consulta la API de Python de la API de Transcoder documentación de referencia.
Para autenticarte en la API de Transcoder, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Reproduce el video
Para ver los subtítulos en Windows, reproduce el video en la app de Películas y TV. Asegúrate de seleccionar la pista de subtítulos.
Para ver los subtítulos en MacOS o Linux, puedes reproducir el video en Shaka Player. Asegúrate de habilita los subtítulos desde el menú Subtítulos.
Para reproducir el archivo multimedia generado en Shaka Player, sigue estos pasos:
- Configura el bucket de Cloud Storage para que sea legible de forma pública.
- Para habilitar el uso compartido de recursos multiorigen (CORS) en un depósito de Cloud Storage, haz lo siguiente:
- Crea un archivo JSON que contenga la siguiente información:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ]
-
Ejecuta el siguiente comando después de reemplazar JSON_FILE_NAME por el nombre del archivo JSON que creaste en el paso anterior:
gcloud storage buckets update gs://STORAGE_BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Crea un archivo JSON que contenga la siguiente información:
- Elige uno de los archivos MP4 o de manifiesto que generó el trabajo de transcodificación en el bucket de Cloud Storage. Haz clic en Copiar URL en la columna Acceso público del archivo.
- Navega a Shaka Player, un reproductor en línea de transmisión en vivo.
- Haz clic en Contenido personalizado en la barra de navegación superior.
- Haz clic en el botón +.
Pega la URL pública del archivo en la casilla URL del manifiesto.
Escribe un nombre en el cuadro Nombre.
Haz clic en Guardar.
Haz clic en Play!.
Selecciona el botón de puntos suspensivos en la parte inferior derecha del reproductor y habilítalo subtítulos.
Ejemplo
Puedes usar los siguientes archivos para un trabajo de prueba:
- Video de entrada de muestra
- Archivo de subtítulos de entrada de muestra para subtítulos opcionales
- Ejemplo de archivo de subtítulos de entrada para subtítulos en inglés
- Archivo de subtítulos de entrada de muestra para subtítulos en español
El archivo de subtítulos de entrada no debe contener líneas en blanco entre líneas de texto.