En esta página, se explica cómo agregar subtítulos y subtítulos a un video de salida.
Los subtítulos son la representación visual del audio de un video. Por lo general, los subtítulos se muestran en el mismo idioma que el audio y también incluyen los sonidos de fondo y los cambios de orador.
Por lo general, los subtítulos se usan para traducir el diálogo de un video a otro idioma. Por lo general, los subtítulos no incluyen sonidos de fondo ni cambios de orador.
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 o subtítulos ocultos. Proporcionas este archivo como entrada para un trabajo.
Agrega subtítulos a la configuración de un trabajo
Consulta las entradas y salidas compatibles para conocer los formatos de archivo de subtítulos de entrada admitidos. Se proporcionan un archivo de video de muestra y archivos de subtítulos de entrada de muestra para que pruebes tu configuración.
Usa la información de las siguientes secciones para agregar subtítulos a la configuración de un trabajo. En esta página, se supone que conoces un JobConfig básico. Para obtener más información sobre cómo crear trabajos de transcodificación, consulta Crea y administra 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:
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 a la línea de tiempo del video de salida.Agrega un objeto
EditAtom
al arrayeditList
. Este objetoEditAtom
debe hacer referencia a las claves del video de entrada y los subtítulos que agregaste en el arrayinputs
. Puedes designar unstartTimeOffset
y unendTimeOffset
para cortar el video de entrada.Agrega los subtítulos a los contenedores de salida. Para ello, agrega 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 array
mapping
en el objeto de configuracióntextStream
para hacer referencia a la clave del objetoEditAtom
.
En el siguiente ejemplo de configuración, se incorporan subtítulos opcionales 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:
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 la Configuración de IAM.LOCATION
: Es la ubicación en la que se ejecutará tu trabajo. Usa 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
: 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 se transcodificará, comomy-vid.mp4
. Este campo debe tener en cuenta todas las carpetas que creaste en el bucket (por ejemplo,input/my-vid.mp4
).STORAGE_CAPTIONS_FILE
: Es el nombre de un archivo de subtítulos en tu bucket de Cloud Storage, comocaptions.srt
. Este campo debe tener en cuenta todas las carpetas que creaste en el bucket (por ejemplo,input/captions.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 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
: 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 se transcodificará, comomy-vid.mp4
. Este campo debe tener en cuenta todas las carpetas que creaste en el bucket (por ejemplo,input/my-vid.mp4
).STORAGE_CAPTIONS_FILE
: Es el nombre de un archivo de subtítulos en tu bucket de Cloud Storage, comocaptions.srt
. Este campo debe tener en cuenta todas las carpetas que creaste en el bucket (por ejemplo,input/captions.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": "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 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 este ejemplo, sigue las instrucciones de configuración para Go que encontrarás en la guía de inicio rápido sobre las bibliotecas cliente de la API de Transcoder. Si deseas obtener más información, consulta la documentación de referencia de la API de Transcoder Go.
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 este ejemplo, sigue las instrucciones de configuración para Java que encontrarás en la guía de inicio rápido sobre las bibliotecas cliente de la API de Transcoder. Si deseas obtener más información, consulta la documentación de referencia de la API de Transcoder Java.
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 este ejemplo, sigue las instrucciones de configuración para Node.js que encontrarás en la guía de inicio rápido sobre las bibliotecas cliente de la API de Transcoder. Si deseas obtener más información, consulta la documentación de referencia de la API de Transcoder Node.js.
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 este ejemplo, sigue las instrucciones de configuración para Python que encontrarás en la guía de inicio rápido sobre las bibliotecas cliente de la API de Transcoder. Si deseas obtener más información, consulta la documentación de referencia de la API de Transcoder Python.
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.
Cómo agregar subtítulos
Para crear un trabajo que produzca archivos de subtítulos en varios idiomas que se reproducen desde un manifiesto, 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.Agrega otro objeto
Input
que defina el URI del 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
para cortar el video de entrada.Agrega los subtítulos a los contenedores de salida. Para ello, agrega un objeto
textStream
al arrayelementaryStreams
.En el caso del archivo de subtítulos independiente, especifica el contenedor en el array
muxStream
. Consulta los objetos con las clavestext-vtt-en
ytext-vtt-es
en la siguiente configuración. En el caso de los subtítulos incorporados, 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 de DASH en archivos WebVTT se crean 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 la Configuración de IAM.LOCATION
: Es la ubicación en la que se ejecutará tu trabajo. Usa 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
: 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 se transcodificará, comomy-vid.mp4
. Este campo debe tener en cuenta 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 tener en cuenta 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 los subtítulos en español. Este campo debe tener en cuenta todas las carpetas que creaste en el 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 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
: 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 se transcodificará, comomy-vid.mp4
. Este campo debe tener en cuenta 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 tener en cuenta 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 los subtítulos en español. Este campo debe tener en cuenta todas las carpetas que creaste en el 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 este ejemplo, sigue las instrucciones de configuración para Go que encontrarás en la guía de inicio rápido sobre las bibliotecas cliente de la API de Transcoder. Si deseas obtener más información, consulta la documentación de referencia de la API de Transcoder Go.
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 este ejemplo, sigue las instrucciones de configuración para Java que encontrarás en la guía de inicio rápido sobre las bibliotecas cliente de la API de Transcoder. Si deseas obtener más información, consulta la documentación de referencia de la API de Transcoder Java.
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 este ejemplo, sigue las instrucciones de configuración para Node.js que encontrarás en la guía de inicio rápido sobre las bibliotecas cliente de la API de Transcoder. Si deseas obtener más información, consulta la documentación de referencia de la API de Transcoder Node.js.
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 este ejemplo, sigue las instrucciones de configuración para Python que encontrarás en la guía de inicio rápido sobre las bibliotecas cliente de la API de Transcoder. Si deseas obtener más información, consulta la documentación de referencia de la API de Transcoder Python.
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 habilitar los subtítulos en 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 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 un trabajo de prueba:
- Video de entrada de muestra
- Archivo de subtítulos de entrada de muestra para subtítulos opcionales
- Archivo de subtítulos de entrada de muestra 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 las líneas de texto.