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 hacer referencia a un archivo de texto que contiene subtítulos. Proporcionas este archivo como entrada a 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 Cómo crear y administrar trabajos.
Cómo agregar subtítulos
Para crear un trabajo que incorpore subtítulos en el contenedor de archivos 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 recortar 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 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 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:
Cómo agregar subtítulos
Para crear un trabajo que produzca archivos de subtítulos en varios idiomas que se reproduzcan 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 recortar el video de entrada.Agrega los subtítulos a los contenedores de salida agregando un objeto
textStream
al arrayelementaryStreams
.Para el archivo de subtítulo independiente, especifica el contenedor en el array
muxStream
. Consulta los objetos con las clavestext-vtt-en
ytext-vtt-es
en la siguiente configuración. Para los subtítulos incorporados, solo necesitas la transmisión 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 los 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 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 representar 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 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 representar 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 esta muestra, sigue las instrucciones de configuración de Go que se encuentran en la Guía de inicio rápido de la API de Transcoder para usar 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. Si deseas obtener más información, consulta la documentación de referencia de la API de Java 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.
Node.js
Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js que se encuentran en la Guía de inicio rápido de la API de Transcoder para usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Node.js 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.
Python
Antes de probar esta muestra, sigue las instrucciones de configuración de Python que se encuentran en la Guía de inicio rápido de la API de Transcoder para usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Python 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.
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 Play!.
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 tarea 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 líneas de texto.