En esta página se explica cómo añadir subtítulos a un vídeo de salida.
Los subtítulos son la representación textual del audio de un vídeo. Los subtítulos suelen estar en el mismo idioma que el audio e incluyen sonidos de fondo y cambios de interlocutor.
Los subtítulos se suelen usar para traducir el diálogo de un vídeo a otro idioma. Los subtítulos no suelen incluir sonidos de fondo ni cambios de interlocutor.
En esta página se usa el término archivo de subtítulos de entrada para hacer referencia a un archivo de texto que contiene subtítulos. Este archivo se proporciona como entrada de un trabajo.
Añadir subtítulos a una configuración de trabajo
Consulta los formatos de archivo de subtítulos de entrada y salida admitidos. Se proporcionan un archivo de vídeo de ejemplo y archivos de subtítulos de entrada de ejemplo para que pruebes tu configuración.
Utiliza la información de las secciones siguientes para añadir subtítulos a una configuración de trabajo. En esta página se da por supuesto que conoces la configuración básica de JobConfig. Para obtener más información sobre cómo crear tareas de transcodificación, consulta Crear y gestionar tareas.
Añadir títulos
Para crear un trabajo que inserte subtítulos en el contenedor del archivo de vídeo de salida, haz lo siguiente:
Añade una matriz
inputs
al principio de la configuración del trabajo.Añade un objeto
Input
al arrayinputs
que define la clave y el URI del vídeo de entrada asociado.Añade otro objeto
Input
que incluya la ruta al archivo de subtítulos de entrada.Añade un array
editList
a la configuración del trabajo. Esta matriz se usa para añadir entradas a la cronología del vídeo de salida.Añada un objeto
EditAtom
al arrayeditList
. Este objetoEditAtom
debe hacer referencia a las claves del vídeo de entrada y los subtítulos que hayas añadido en la matrizinputs
. Puedes designar unstartTimeOffset
y unendTimeOffset
para recortar el vídeo de entrada.Añade los subtítulos a los contenedores de salida añadiendo un objeto
textStream
al arrayelementaryStreams
. Solo se admite una emisión de texto insertada, que se añade a todos los vídeos de salida (ya que solo hay una línea de tiempo de salida).Usa la matriz
mapping
en el objeto de configuracióntextStream
para hacer referencia a la clave del objetoEditAtom
.
En la siguiente configuración de ejemplo se insertan subtítulos CEA-608 en un vídeo.
Puedes añadir esta configuración a una plantilla de tarea o incluirla en una configuración de tarea específica:
REST
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
PROJECT_ID
: ID de tu proyecto Google Cloud que aparece en la sección Configuración de IAM.LOCATION
: la ubicación en la que se ejecutará el trabajo. Utiliza una de las regiones admitidas.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
me-west1
me-central1
me-central2
STORAGE_BUCKET_NAME
: nombre del segmento de Cloud Storage que has creado.STORAGE_INPUT_VIDEO
: el nombre de un vídeo de tu cubo de Cloud Storage que estás transcodificando, comomy-vid.mp4
. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/my-vid.mp4
).STORAGE_CAPTIONS_FILE
: el nombre de un archivo de subtítulos de tu segmento de Cloud Storage, comocaptions.srt
. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/captions.srt
).STORAGE_OUTPUT_FOLDER
: nombre de la carpeta de salida del segmento de Cloud Storage en la que quieras guardar los vídeos codificados.
Para enviar tu solicitud, despliega una de estas opciones:
Deberías recibir una respuesta JSON similar a la siguiente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
gcloud
Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:
LOCATION
: la ubicación en la que se ejecutará el trabajo. Utiliza una de las regiones admitidas.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
me-west1
me-central1
me-central2
STORAGE_BUCKET_NAME
: nombre del segmento de Cloud Storage que has creado.STORAGE_INPUT_VIDEO
: el nombre de un vídeo de tu cubo de Cloud Storage que estás transcodificando, comomy-vid.mp4
. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/my-vid.mp4
).STORAGE_CAPTIONS_FILE
: el nombre de un archivo de subtítulos de tu segmento de Cloud Storage, comocaptions.srt
. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/captions.srt
).STORAGE_OUTPUT_FOLDER
: nombre de la carpeta de salida del segmento de Cloud Storage en la que quieras guardar los vídeos codificados.
Guarda el siguiente contenido en un archivo llamado 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/" } } }
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 siguiente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
Go
Antes de probar este ejemplo, sigue las Go instrucciones de configuración de la guía de inicio rápido de la API Transcoder con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Transcoder API Go.
Para autenticarte en la API Transcoder, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Antes de probar este ejemplo, sigue las Java instrucciones de configuración de la guía de inicio rápido de la API Transcoder con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Transcoder API Java.
Para autenticarte en la API Transcoder, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Antes de probar este ejemplo, sigue las Node.js instrucciones de configuración de la guía de inicio rápido de la API Transcoder con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Transcoder API Node.js.
Para autenticarte en la API Transcoder, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Antes de probar este ejemplo, sigue las Python instrucciones de configuración de la guía de inicio rápido de la API Transcoder con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Transcoder API Python.
Para autenticarte en la API Transcoder, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Añadir subtítulos
Para crear un trabajo que genere archivos de subtítulos en varios idiomas que se reproduzcan desde un manifiesto, sigue estos pasos:
Añade un array
inputs
a la configuración del trabajo.Añade un objeto
Input
al arrayinputs
que define la clave y el URI del vídeo de entrada asociado.Añade otro objeto
Input
que defina el URI del archivo de subtítulos de entrada.Añade una matriz
editList
a la configuración. Esta matriz se usa para añadir las entradas a la cronología del vídeo de salida.Añade un objeto
EditAtom
al arrayeditList
que haga referencia a los objetos del arrayinputs
por clave. Puedes designar unstartTimeOffset
y unendTimeOffset
para recortar el vídeo de entrada.Añade los subtítulos a los contenedores de salida añadiendo un objeto
textStream
al arrayelementaryStreams
.En el caso del archivo de subtítulos independiente, especifica el contenedor en la matriz
muxStream
. Consulta los objetos con las clavestext-vtt-en
ytext-vtt-es
en la siguiente configuración. En el caso de los subtítulos insertados, solo necesitas el flujo elemental.
La siguiente configuración genera varios archivos WebVTT, uno para los subtítulos en inglés y otro para los subtítulos en español. Los subtítulos DASH en archivos WebVTT se crean en el formato de contenedor fMP4.
Puedes añadir esta configuración a una plantilla de tarea o incluirla en una configuración de tarea específica:
REST
Antes de usar los datos de la solicitud, haz las siguientes sustituciones:
PROJECT_ID
: ID de tu proyecto Google Cloud que aparece en la sección Configuración de IAM.LOCATION
: la ubicación en la que se ejecutará el trabajo. Utiliza una de las regiones admitidas.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
me-west1
me-central1
me-central2
STORAGE_BUCKET_NAME
: nombre del segmento de Cloud Storage que has creado.STORAGE_INPUT_VIDEO
: el nombre de un vídeo de tu cubo de Cloud Storage que estás transcodificando, comomy-vid.mp4
. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/my-vid.mp4
).STORAGE_SUBTITLES_FILE1
: el nombre del archivo de subtítulos en tu segmento de Cloud Storage, comosubtitles-en.srt
para los subtítulos en inglés. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/subtitles-en.srt
).STORAGE_SUBTITLES_FILE2
: el nombre de otro archivo de subtítulos de tu segmento de Cloud Storage, comosubtitles-es.srt
para los subtítulos en español. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/subtitles-es.srt
).STORAGE_OUTPUT_FOLDER
: nombre de la carpeta de salida del segmento de Cloud Storage en la que quieras guardar los vídeos codificados.
Para enviar tu solicitud, despliega una de estas opciones:
Deberías recibir una respuesta JSON similar a la siguiente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
gcloud
Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:
LOCATION
: la ubicación en la que se ejecutará el trabajo. Utiliza una de las regiones admitidas.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
me-west1
me-central1
me-central2
STORAGE_BUCKET_NAME
: nombre del segmento de Cloud Storage que has creado.STORAGE_INPUT_VIDEO
: el nombre de un vídeo de tu cubo de Cloud Storage que estás transcodificando, comomy-vid.mp4
. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/my-vid.mp4
).STORAGE_SUBTITLES_FILE1
: el nombre del archivo de subtítulos en tu segmento de Cloud Storage, comosubtitles-en.srt
para los subtítulos en inglés. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/subtitles-en.srt
).STORAGE_SUBTITLES_FILE2
: el nombre de otro archivo de subtítulos de tu segmento de Cloud Storage, comosubtitles-es.srt
para los subtítulos en español. En este campo se deben tener en cuenta las carpetas que hayas creado en el segmento (por ejemplo,input/subtitles-es.srt
).STORAGE_OUTPUT_FOLDER
: nombre de la carpeta de salida del segmento de Cloud Storage en la que quieras guardar los vídeos codificados.
Guarda el siguiente contenido 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 siguiente:
{ "name": "projects/PROJECT_NUMBER/locations/LOCATION/jobs/JOB_ID", "config": { ... }, "state": "PENDING", "createTime": CREATE_TIME, "ttlAfterCompletionDays": 30 }
Go
Antes de probar este ejemplo, sigue las Go instrucciones de configuración de la guía de inicio rápido de la API Transcoder con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Transcoder API Go.
Para autenticarte en la API Transcoder, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Antes de probar este ejemplo, sigue las Java instrucciones de configuración de la guía de inicio rápido de la API Transcoder con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Transcoder API Java.
Para autenticarte en la API Transcoder, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Antes de probar este ejemplo, sigue las Node.js instrucciones de configuración de la guía de inicio rápido de la API Transcoder con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Transcoder API Node.js.
Para autenticarte en la API Transcoder, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Antes de probar este ejemplo, sigue las Python instrucciones de configuración de la guía de inicio rápido de la API Transcoder con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Transcoder API Python.
Para autenticarte en la API Transcoder, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Reproducir un vídeo
Para ver los subtítulos en Windows, reproduce el vídeo en la aplicación 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 vídeo en Shaka Player. Asegúrate de activar los subtítulos en el menú Subtítulos.
Para reproducir el archivo multimedia generado en Shaka Player, sigue estos pasos:
- Haz que el segmento de Cloud Storage que has creado se pueda leer públicamente.
- Para habilitar el uso compartido de recursos entre dominios (CORS) en un segmento de Cloud Storage, sigue estos pasos:
- Crea un archivo JSON que contenga lo siguiente:
[ { "origin": ["https://shaka-player-demo.appspot.com/"], "responseHeader": ["Content-Type", "Range"], "method": ["GET", "HEAD"], "maxAgeSeconds": 3600 } ]
-
Ejecuta el siguiente comando después de sustituir JSON_FILE_NAME por el nombre del archivo JSON que has creado en el paso anterior:
gcloud storage buckets update gs://STORAGE_BUCKET_NAME --cors-file=JSON_FILE_NAME.json
- Crea un archivo JSON que contenga lo siguiente:
- Elige uno de los archivos MP4 o de manifiesto generados por el trabajo de transcodificación en el segmento de Cloud Storage. En la columna Acceso público del archivo, haz clic en Copiar URL.
- Ve a Shaka Player, un reproductor de emisiones en directo online.
- En la barra de navegación superior, haga clic en Contenido personalizado.
- Haz clic en el botón +.
Pega la URL pública del archivo en el cuadro URL del manifiesto.
Escribe un nombre en el cuadro Nombre.
Haz clic en Guardar.
Haz clic en Reproducir.
Selecciona el botón de puntos suspensivos en la parte inferior derecha del reproductor y habilita los subtítulos.
Ejemplo
Puedes usar los siguientes archivos para una prueba:
- Vídeo de entrada de ejemplo
- Archivo de subtítulos de entrada de ejemplo para subtítulos
- Archivo de subtítulos de entrada de ejemplo para subtítulos en inglés
- Archivo de subtítulos de entrada de ejemplo para subtítulos en español
El archivo de subtítulos de entrada no debe contener líneas en blanco entre las líneas de texto.