El objeto de video
El objeto de video es un objeto JSON con las siguientes propiedades:
{
"id": string,
"status": "COMPLETE" | "PROGRESSING" | "REPLACING" | "NO_FILE" | "ERROR",
"statusProgress": number,
"errorCode": string | null,
"errorMessage": string | null,
"visibility": "public" | "private",
"v": number,
"title": string,
"description": string,
"duration": number,
"fps": number,
"orientation": "landscape" | "portrait",
"language": string,
"aiContent": "none" | "generated" | "modified",
"src": {
"thumbnails": [
{
"name": "2160p" | "1440p" | "1080p" | "720p" | "480p" | "360p" | "240p",
"width": number,
"height": number,
"formats": {
"jpeg": { "url": string, "fileSize": number },
"webp": { "url": string, "fileSize": number }
}
},
[...]
],
"thumbnailUrl": string, // DEPRECATED — use src.thumbnails instead
"filename": string,
"abr": {
"resolution": "auto",
"description": "Adaptive Bitrate Streaming (ABR)",
"url": string, // .m3u8 playlist file
"maxWidth": number,
"maxHeight": number
},
"hls": [
{
"name": "2160p" | "1440p" | "1080p" | "720p" | "540p" | "360p" | "240p",
"url": string, // .m3u8 playlist file
"width": number,
"height": number
},
[...]
],
"mp4": [
{
"name": "2160p" | "1440p" | "1080p" | "720p" | "540p" | "360p" | "240p",
"url": string, // .mp4 file
"width": number,
"height": number
},
[...]
],
"audio": [
{
"name": string, // for example "high-quality" or "low-quality"
"url": string
},
[...]
]
},
"texttracks": [
{
"id": string,
"language": "en-US" | "de-DE" | "...", // region locale
"filename": string,
"type": "subtitles" | "captions",
"url": string,
"autoGenerated": boolean,
"autoTranslated": boolean,
"edited": boolean,
"updatedAt": Date,
"content": string // URL-encoded placeholder. GET the track for the WebVTT.
},
[...]
],
"chapters": [
{
"id": string,
"title": string,
"timestamp": string, // 00:00:00
},
[...]
],
"categories": [
{
"id": string,
"title": string,
"slug": string,
"description": string,
},
[...]
],
"tags": [
{
"id": string,
"title": string,
"slug": string,
"description": string,
},
[...]
],
"transcriptions": [
{
"language": string, // locale in de-DE format
"autoGenerated": boolean,
"text": string, // plain text transcript
"segments": [
{
"startTime": number, // in seconds
"endTime": number, // in seconds
"text": string
},
[...]
],
},
[...]
],
"audiotracks": [ ... ], // present on the object; ignored by PATCH
"autoTranscription": {
"autoStart": boolean,
"lastUpdatedAt": Date,
"data": object // transcription records; population follows depth
},
"contentUpdatedAt": Date, // bumped on content writes; not writable
"customMetadata": object,
"passwordProtection": {
"enabled": boolean,
"password": string // present for callers who can update the video
},
"previewVideoUrl": string,
"previewThumbnailUrl": string,
"previewThumbnailUrlSmall": string,
"player": {
"selectedPreset": object | null, // player preset object
"useCustomDesign": boolean,
"playerDesign": { ... }, // player design properties, see "Player settings"
"shareUrl": string
},
"workspace": string, // workspace id; stays an id at every depth
"createdAt": Date,
"updatedAt": Date
}aiContent
Marca de contenido IA para contenido generado o modificado con IA que podría parecer auténtico, como exigen normativas como el Reglamento de IA de la UE (art. 50). none (predeterminado) significa que el reproductor embebido nunca muestra la etiqueta IA. generated y modified muestran la etiqueta IA en el reproductor cuando la opción de diseño aiContentLabel no es off.
v
Versión del archivo. Empieza en 0 y aumenta cuando un archivo de reemplazo termina la codificación.
autoTranscription
autoTranscription es un único objeto con autoStart, lastUpdatedAt y data. autoStart indica si la transcripción empieza después de la codificación. data guarda los registros de transcripción relacionados, y su población sigue depth. Los videos de más de 3 horas generan varios trabajos de transcripción. Consulta transcribe para esos registros de trabajo.
contentUpdatedAt
Marca de tiempo que se actualiza en las escrituras de contenido. No puedes establecer este campo.
customMetadata
Un objeto plano de datos personalizados, con 50 claves como máximo. Cada clave coincide con ^[a-zA-Z0-9_-]+$ y tiene 40 caracteres como máximo. Cada valor es una cadena de 500 caracteres como máximo, un número finito o un booleano. Los objetos anidados y los arrays se rechazan. Una escritura posterior se fusiona con el objeto almacenado. Enviar "" o null para una clave elimina esa clave. Puedes establecerlo al crear o actualizar un video.
passwordProtection
enabled indica si el video requiere una contraseña. password se incluye para quien puede actualizar el video, cuando el espacio de trabajo tiene la protección por contraseña activada. En una actualización, password debe tener al menos 8 caracteres. El campo solo se puede escribir mientras esa función está activa.
categories y tags
Con la profundidad predeterminada, cada entrada es un objeto con id, title, slug y description. Con depth=0, cada entrada es un id. Una lista vacía es null.
URLs de vista previa
previewVideoUrl, previewThumbnailUrl y previewThumbnailUrlSmall son URLs de vista previa firmadas. Se añaden en la lectura cuando existen rendiciones.
Ajustes del reproductor
La propiedad player contiene el diseño del reproductor del video. Solo se incluye en las respuestas a solicitudes con una Clave API. Los payloads de webhook no la incluyen.
| Propiedad | Descripción |
|---|---|
selectedPreset | El preset del reproductor asignado al video, o null. |
useCustomDesign | Si es true, el video usa su propio playerDesign en lugar del preset. |
playerDesign | El diseño del reproductor del video. Tiene las mismas propiedades que un preset del reproductor. La configuración del reproductor embed describe cada ajuste. |
shareUrl | La URL del reproductor embed de este video en el dominio de tu espacio de trabajo. Úsala como src de un iframe o como enlace para compartir. |
selectedPreset y useCustomDesign solo se incluyen si tu plan incluye diseños de reproductor personalizados y el espacio de trabajo tiene al menos un preset del reproductor.
Para encontrar el diseño que usa el reproductor:
- Si
useCustomDesignestrueoselectedPresetesnull, usaplayerDesign. - De lo contrario, usa las propiedades de diseño de
selectedPreset.
Estado de codificación
Estos campos describen el ciclo de vida de la codificación después de subir o reemplazar un archivo de video.
Ciclo de vida típico
- Después de crear un objeto de video,
statusesNO_FILEhasta que se sube un archivo. - Cuando termina la subida del archivo, comienza la codificación y
statuspasa aPROGRESSING.statusProgressavanza de0hacia100. - Si tiene éxito,
statuspasa aCOMPLETE,statusProgresses100, y las fuentes de reproducción están disponibles ensrc. - Si falla,
statuspasa aERROR. LeeerrorCodeyerrorMessagepara obtener detalles.
Cuando reemplazas un video, status pasa brevemente a REPLACING mientras se sube el archivo nuevo y luego sigue el mismo camino PROGRESSING → COMPLETE / ERROR.
status
| Valor | Descripción |
|---|---|
NO_FILE | El objeto de video existe, pero aún no se ha subido ningún archivo |
PROGRESSING | La codificación está en curso |
REPLACING | Se está subiendo un archivo nuevo para reemplazar el video existente |
COMPLETE | La codificación finalizó correctamente; las fuentes de reproducción están disponibles en src |
ERROR | La codificación falló |
statusProgress
Progreso de codificación como porcentaje de 0 a 100.
Mientras status sea PROGRESSING, consulta GET /api/videos/[VIDEO_ID] (ver obtener video) y lee statusProgress para mostrar el progreso en tu UI. Un intervalo de sondeo de unos pocos segundos suele ser suficiente.
También puedes suscribirte a webhooks video.updated. Las actualizaciones de progreso pueden dispararse con frecuencia durante la codificación; debounce las actualizaciones de la UI si es necesario. Ver Webhooks.
Cuando la codificación termina, status pasa a COMPLETE y statusProgress es 100.
errorCode y errorMessage
Cuando status es ERROR, estos campos explican el fallo. Prefiere errorCode para el manejo programático. Usa errorMessage como respaldo legible si no mapeas el código tú mismo.
Ambos campos son null (o están ausentes) cuando el video no está en estado de error.
Ejemplo cuando la codificación falla:
{
"id": "[VIDEO_ID]",
"status": "ERROR",
"statusProgress": 42,
"errorCode": "MEDIACONVERT_1040",
"errorMessage": "Invalid or unsupported file format"
}errorCode | Descripción |
|---|---|
DURATION_LIMIT_EXCEEDED | La duración del video supera el límite de tu cuenta |
UNKNOWN_ERROR | Se produjo un error desconocido durante el procesamiento |
MEDIACONVERT_1040 | Formato de archivo no válido o no compatible |
MEDIACONVERT_1041 | El archivo de entrada está corrupto o incompleto |
MEDIACONVERT_1050 | Códec de video no compatible |
MEDIACONVERT_1060 | Códec de audio no compatible |
MEDIACONVERT_1071 | Resolución o relación de aspecto de video no válida |
MEDIACONVERT_3000 | Servicio temporalmente no disponible; inténtalo de nuevo más tarde |
Pueden aparecer valores adicionales de errorCode con el tiempo. Usa siempre errorMessage (o un mensaje genérico de fallo) para códigos desconocidos.
Miniaturas
src.thumbnails
Variantes multiresolución de la miniatura activa en este momento. El array está ordenado por anchura descendente (primero la mayor resolución). Solo se generan tamaños iguales o menores que la imagen de origen. Resoluciones disponibles: 2160p, 1440p, 1080p, 720p, 480p, 360p, 240p.
{
"name": "2160p" | "1440p" | "1080p" | "720p" | "480p" | "360p" | "240p",
"width": number,
"height": number,
"formats": {
"jpeg": { "url": string, "fileSize": number },
"webp": { "url": string, "fileSize": number }
}
}Cada variante de resolución está disponible en formato JPEG y WebP. Usa formats.webp.url para archivos más pequeños o formats.jpeg.url para máxima compatibilidad. Para obtener la miniatura a mayor resolución, usa src.thumbnails[0].formats.jpeg.url (o .webp.url). Para elegir una resolución concreta, filtra el array por name, width o height.
src.thumbnailUrl (obsoleto)
Obsoleto — Usa src.thumbnails en su lugar. Este campo se eliminará en una versión futura.
Contiene la URL de la variante 1080p (o la mayor disponible) de la miniatura activa. Se actualiza automáticamente cuando cambia la miniatura.
Ciclo de vida de las miniaturas
| Evento | src.thumbnails | src.thumbnailUrl |
|---|---|---|
| Finaliza el procesamiento del video | Se rellena con variantes generadas | Se establece a la variante 1080p (o la mayor disponible) |
| Se sube una miniatura personalizada | Se sustituye por nuevas variantes | Se actualiza a la variante 1080p (o la mayor disponible) |
| Miniatura desde marca de tiempo | Se sustituye por nuevas variantes | Se actualiza a la variante 1080p (o la mayor disponible) |
| Restablecimiento de miniatura | Se restauran las variantes autogeneradas | Se restaura la variante 1080p (o la mayor disponible) |
Fuentes de video
Arrays src de video
Los arrays hls y mp4 contienen una lista de todas las fuentes de video disponibles. Están ordenados por calidad, empezando por la mayor. Las variantes de video se generan hasta la resolución del video de entrada. Así, un video subido en 1080p no tendrá variantes 2160p ni 1440p.
{
"name": "2160p" | "1440p" | "1080p" | "720p" | "540p" | "360p" | "240p",
"url": string,
"width": number,
"height": number
}Adaptive Bitrate Streaming (ABR)
Si quieres ofrecer tus videos mediante streaming de bitrate adaptativo (abreviado ABR), puedes hacerlo usando src.abr.url como fuente de video. El archivo de lista de reproducción incluye todas las calidades de video indicadas en el array src.hls.
src.audio
src.audio enumera las rendiciones de audio del video. Cada entrada tiene name y url. name es una etiqueta como high-quality o low-quality.