# Transcodificar, redimensionar o añadir marcas de agua a videos

Robot: `/video/encode`

🤖/video/encode codifica, redimensiona y aplica marcas de agua a videos y GIFs animados.

El Robot /video/encode es una herramienta versátil para procesar videos que permite transcodificar, redimensionar y añadir marcas de agua. Admite varios formatos, incluidos estándares modernos como HEVC (H.265), y ofrece funciones como ajustes preestablecidos para dispositivos comunes, parámetros personalizados de FFmpeg para usuarios avanzados, posicionamiento de marcas de agua y mucho más.

## Añadir superposiciones de texto con FFmpeg

Puedes añadir superposiciones de texto a los videos mediante el filtro `drawtext` de FFmpeg a través del parámetro `ffmpeg` del <dfn>Robot</dfn>. Estos son dos ejemplos: uno con la fuente predeterminada y otro con el nombre de una familia de fuentes personalizada:

```json
{
  "steps": {
    ":original": {
      "robot": "/upload/handle"
    },
    "text_overlay_default": {
      "use": ":original",
      "robot": "/video/encode",
      "preset": "empty",
      "ffmpeg_stack": "{{stacks.ffmpeg.recommended_version}}",
      "ffmpeg": {
        "codec:a": "copy",
        "vf": "drawtext=text='My text overlay':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2"
      },
      "result": true
    },
    "text_overlay_custom": {
      "use": ":original",
      "robot": "/video/encode",
      "preset": "empty",
      "ffmpeg_stack": "{{stacks.ffmpeg.recommended_version}}",
      "ffmpeg": {
        "codec:a": "copy",
        "vf": "drawtext=font='Times New Roman':text='My text overlay':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2"
      },
      "result": true
    }
  }
}
```

**Notas:**

* Usa el atributo `font` para hacer referencia a una fuente por el nombre de su familia con `drawtext` de FFmpeg.
* Los nombres de familias de fuentes de FFmpeg normalmente no contienen guiones (por ejemplo, `Times New Roman`), mientras que
  ImageMagick utiliza nombres con guiones (por ejemplo, `Times-New-Roman`).
* No se admiten las opciones de `drawtext` para cargar archivos, como `textfile` y `fontfile`. En su lugar, usa
  `text` en línea y el nombre de una familia de fuentes.
* Conserva el audio de origen configurando `"codec:a": "copy"`.
* Posiciona el texto con las expresiones `x` y `y`. El ejemplo anterior centra el texto.

Consulta la [demo en vivo de superposición de texto](/demos/video-encoding/add-text-overlay.md).

Etapa: ga

## Ejemplo de uso

Transcodifica el video subido a \[HEVC]\(https\://en.wikipedia.org/wiki/High\_Efficiency\_Video\_Coding) (H.265):

```json
{
  "steps": {
    "hevc_encoded": {
      "robot": "/video/encode",
      "use": ":original",
      "preset": "hevc"
    }
  }
}
```

## Parámetros

* `interpolate`: Controla si las Assembly Variables se interpolan en campos de instrucciones individuales.

  De forma predeterminada, la mayoría de los campos de instrucciones de los Robots interpolan Assembly Variables. Establece esta opción en `false` para tratar todos los campos de instrucciones como texto literal, o establece la ruta de un campo individual en `false` para tratar únicamente ese campo como texto literal. En el caso de los campos específicos de un Robot que son literales de forma predeterminada, establece esta opción en `true` o la ruta de ese campo en `true` para volver a habilitar la interpolación.

  Usa nombres de campos como `path` o rutas con puntos como `ffmpeg.vf` para los objetos anidados.

* `output_meta`: Te permite especificar un conjunto de metadatos cuyo cálculo requiere más recursos de CPU y que, por lo tanto, está desactivado de forma predeterminada para que tus Assemblies se procesen rápidamente.

  Para imágenes, puedes añadir `"has_transparency": true` a este objeto para determinar si la imagen contiene partes transparentes y `"dominant_colors": true` para extraer un array de códigos de color hexadecimales de la imagen.

  Para imágenes, también puedes añadir `"blurhash": true` para extraer una cadena [BlurHash](https://blurha.sh), una representación compacta de un marcador de posición para la imagen que resulta útil para mostrar una vista previa desenfocada mientras se carga la imagen completa.

  Para videos, puedes añadir el parámetro `"colorspace": true` para extraer el espacio de color del video de salida.

  Para videos, también puedes añadir `"interlaced": true` para detectar si el video está entrelazado. Esto combina el indicador `field_order` de ffprobe, cuyo costo en recursos de procesamiento es bajo, con una pasada de muestreo limitada mediante `idet` sobre los primeros fotogramas de la fuente, y expone `interlaced`, `field_order` y un objeto de diagnóstico `interlace_detection` en `file.meta`. Esto requiere muchos recursos computacionales y se factura en consecuencia.

  Para audio, puedes añadir `"mean_volume": true` para obtener un único valor que represente el volumen promedio del archivo de audio.

  También puedes establecerlo en `false` para omitir la extracción de metadatos y acelerar la transcodificación.

* `user_meta`: Añade metadatos personalizados a cada archivo emitido por este Robot sin modificar el contenido del archivo.

  Los valores se combinan con los `user_meta` existentes en el archivo de entrada. Si ambos objetos contienen la misma clave, el valor de este Robot tiene prioridad. Se admiten Assembly Variables, por ejemplo `{ "internal_file_id": "${file.id}" }`.

* `result`: Indica si los resultados de este Step deben aparecer en el Assembly Status JSON

* `queue`: Establecer la cola en «batch» reduce manualmente la prioridad de los Jobs de este Step para evitar consumir cupos prioritarios con Jobs que no necesitan un tiempo de espera cero en la cola

* `force_accept`: Forzar a un Robot a aceptar un tipo de archivo que habría ignorado.

  De forma predeterminada, los Robots ignoran los archivos que no reconocen.
  [🤖/video/encode](/es/docs/robots/video-encode.md), por
  ejemplo, ignorará sin problemas las imágenes de entrada.

  Si configuras el parámetro `force_accept` como `true`, puedes forzar a los Robots a aceptar todos los archivos que reciban.
  Esto normalmente provocará errores y solo debe usarse para depuración o para abordar casos extremos.

* `ignore_errors`: Ignorar errores durante fases específicas del procesamiento.

  Establecer este parámetro en `["meta"]` hará que el Robot ignore los errores durante la extracción de metadatos.

  Establecer este parámetro en `["execute"]` hará que el Robot ignore los errores durante la fase principal de ejecución.

  Configurar este parámetro como `true` equivale a `["meta", "execute"]` y hará que se ignoren los errores en ambas fases.

* `use`: Especifica qué Step o Steps se usarán como entrada.

  * Puedes elegir cualquier nombre para los Steps, excepto `":original"` (reservado para las subidas de usuarios gestionadas por Transloadit)
  * Puedes proporcionar varios Steps como entrada mediante arrays:
    ```json
    {
      "use": [
        ":original",
        "encoded",
        "resized"
      ]
    }
    ```
  * También puedes etiquetar los Steps de entrada con `as` para comunicar la intención semántica a los Robots:
    ```json
    {
      "use": [
        {
          "name": ":original",
          "as": "image"
        },
        {
          "name": ":original",
          "as": "mask"
        }
      ]
    }
    ```

  > [!Tip]
  > Probablemente eso sea todo lo que necesitas saber sobre `use`, pero puedes consultar los [casos de uso avanzados](/es/docs/topics/use-parameter.md).

* `ffmpeg`: Un objeto de parámetros que se pasará a FFmpeg. Si se utiliza un ajuste preestablecido, las opciones especificadas se combinan con las de ese ajuste. Para consultar las opciones disponibles, revisa la [documentación de FFmpeg](https://ffmpeg.org/ffmpeg-doc.html). Las opciones especificadas aquí tienen prioridad sobre las del ajuste preestablecido.

* `ffmpeg_stack`: Selecciona la versión del stack de FFmpeg que se usará para el encoding. Actualmente recomendamos usar «v7». Las versiones exactas «v6.0.0», «v7.0.0» y «v8.0.0» son valores heredados que siguen aceptándose por compatibilidad con versiones anteriores. También se aceptan los valores obsoletos «v5.x».

* `width`: Ancho del nuevo video, en píxeles.

  Si no se especifica el valor y el parámetro `preset` está disponible, se aplicará el [ancho proporcionado](/es/docs/presets/video.md) por `preset`.

* `height`: Altura del nuevo video, en píxeles.

  Si no se especifica el valor y el parámetro `preset` está disponible, se aplicará la [altura proporcionada](/es/docs/presets/video.md) por `preset`.

* `preset`: Convierte un video según un [ajuste preestablecido](/es/docs/presets/video.md).

  A partir de `ffmpeg_stack: "v7"`, puedes usar aquí el valor `'empty'` si especificas tus propios parámetros de FFmpeg mediante el <dfn>Robot</dfn> o si no quieres que Transloadit establezca ningún ajuste de encoding.

* `resize_strategy`: Consulta las [estrategias de cambio de tamaño disponibles](/es/docs/topics/resize-strategies.md).

* `zoom`: Si se establece en `false`, los videos más pequeños no se estirarán hasta alcanzar el ancho y la altura deseados. Para obtener detalles sobre el efecto del zoom con tu estrategia de redimensionamiento preferida, consulta la lista de [estrategias de redimensionamiento disponibles](/es/docs/topics/resize-strategies.md).

* `crop`: Especifica un objeto que contenga las coordenadas de las esquinas superior izquierda e inferior derecha del rectángulo que se recortará de los videos originales. Los valores pueden ser números enteros para indicar valores absolutos en píxeles o strings para indicar valores porcentuales.

  Por ejemplo:

  ```json
  {
    "x1": 80,
    "y1": 100,
    "x2": "60%",
    "y2": "80%"
  }
  ```

  Esto recortará el área comprendida entre `(80, 100)` y `(600, 800)` de un video de 1000×1000 píxeles, lo que da como resultado un cuadrado con un ancho de 520px y una altura de 700px. Si se establece `crop`, se ignoran los parámetros de ancho y altura, y `resize_strategy` se establece automáticamente en `crop`.

  También puedes usar de manera similar un string JSON de dicho objeto con coordenadas:

  ```json
  "{\"x1\": <Integer>, \"y1\": <Integer>, \"x2\": <Integer>, \"y2\": <Integer>}"
  ```

* `background`: El color de fondo del video resultante en el formato `"rrggbbaa"` (rojo, verde, azul, alfa) cuando se usa con la estrategia de redimensionamiento `"pad"`. El color predeterminado es negro.

* `rotate`: Fuerza la rotación del video según el número entero de grados especificado. Actualmente, solo se admiten múltiplos de `90`. Corregimos automáticamente la orientación de muchos videos cuando la cámara proporciona esa información. Esta opción solo resulta útil para los videos que requieren rotación porque la cámara no la detectó. Si estableces `rotate` en `false`, no se realiza ninguna rotación, incluso si los metadatos contienen instrucciones para ello.

* `hint`: Habilita la preparación de archivos mp4 para streaming mediante RTP/RTSP.

* `turbo`: Divide el video en varios fragmentos para que cada uno pueda codificarse en paralelo antes de que todos los fragmentos codificados vuelvan a unirse para formar el video resultante. Esto requiere <dfn>cupos prioritarios</dfn> adicionales y puede resultar contraproducente para archivos de video muy pequeños.

* `chunk_duration`: Te permite especificar la duración de cada fragmento cuando `turbo` se establece en `true`. Esto significa que puedes aprovechar esa función mientras utilizas menos <dfn>cupos prioritarios</dfn>. Por ejemplo, cuanto más largo sea cada fragmento, menos <dfn>Encoding Jobs</dfn> tendrán que utilizarse.

* `watermark_url`: Una URL que indica una imagen PNG que se superpondrá sobre esta imagen. También [proporciona la marca de agua mediante otro Assembly Step](/es/docs/topics/use-parameter.md#supplying-the-watermark-via-an-assembly-step).

* `watermark_position`: La posición en la que se coloca la marca de agua.

  También se puede especificar un array de valores posibles, en cuyo caso se seleccionará uno al azar, como `[ "center", "left", "bottom-left", "bottom-right" ]`.

  Este ajuste coloca la marca de agua en la esquina especificada. Para aplicar un desplazamiento específico en píxeles a la marca de agua, tendrás que añadir el relleno a la propia imagen.

* `watermark_x_offset`: El desplazamiento en x, expresado en píxeles, con el que se colocará la marca de agua respecto de la posición que tiene debido a `watermark_position`.

  Los valores pueden ser positivos o negativos y producen resultados diferentes según el parámetro `watermark_position`. Los valores positivos acercan la marca de agua al punto central de la imagen, mientras que los valores negativos la alejan de él.

* `watermark_y_offset`: El desplazamiento en y, expresado en píxeles, con el que se colocará la marca de agua respecto de la posición que tiene debido a `watermark_position`.

  Los valores pueden ser positivos o negativos y producen resultados diferentes según el parámetro `watermark_position`. Los valores positivos acercan la marca de agua al punto central de la imagen, mientras que los valores negativos la alejan de él.

* `watermark_size`: El tamaño de la marca de agua, expresado como porcentaje, por ejemplo, `"50%"`. La forma en que se redimensiona la marca de agua depende en gran medida de `watermark_resize_strategy`.

* `watermark_resize_strategy`: Para explicar cómo funcionan las estrategias de redimensionamiento, supongamos que el tamaño del video de destino es de 800×800 píxeles y que la imagen de la marca de agua es de 400×300 píxeles. Supongamos también que el parámetro `watermark_size` está establecido en `"25%"`.

  Con la estrategia de redimensionamiento `"fit"`, la marca de agua se escala de modo que su lado más largo ocupe 25 % del lado correspondiente del video. El otro lado se escala según la relación de aspecto de la imagen de la marca de agua. En nuestro caso, el ancho es el lado más largo y 25 % del tamaño del video equivaldría a 200px. Por lo tanto, la marca de agua se redimensionaría a 200×150 píxeles. Si `watermark_size` estuviera establecido en `"50%"`, se redimensionaría a 400×300 píxeles, es decir, conservaría su tamaño original.

  Con la estrategia de redimensionamiento `"stretch"`, la imagen de la marca de agua se estira, es decir, se redimensiona sin conservar su relación de aspecto, para que ambos lados ocupen 25 % del lado correspondiente del video. Dado que nuestro video es de 800×800 píxeles, con un tamaño de marca de agua de 25 %, esta se redimensionaría a 200×200 píxeles. Su altura se vería estirada, ya que, si se conservara la relación de aspecto, se redimensionaría a 200×150 píxeles.

  Con la estrategia de redimensionamiento `"area"`, la marca de agua se redimensiona conservando su relación de aspecto para que cubra `"xx%"` de la superficie del video. El valor de `watermark_size` se utiliza como porcentaje del área.

* `watermark_start_time`: El retraso, en segundos desde el inicio del video, antes de que aparezca la marca de agua. De forma predeterminada, la marca de agua se muestra inmediatamente.

* `watermark_duration`: La duración, en segundos, durante la que se muestra la marca de agua. Puede utilizarse junto con `watermark_start_time` para crear efectos atractivos. El valor predeterminado es `-1.0`, lo que significa que la marca de agua se muestra durante toda la duración del video.

* `watermark_opacity`: La opacidad de la marca de agua. Los valores válidos están entre `0` (invisible) y `1.0` (visibilidad total).

* `segment`: Divide el archivo en varias partes para usarlas con [HTTP Live Streaming de Apple](https://developer.apple.com/resources/http-streaming/).

* `segment_duration`: Especifica la duración de cada segmento HTTP. Es opcional y el valor predeterminado recomendado por Apple es `10`. No cambies este valor a menos que tengas un buen motivo.

* `segment_prefix`: El prefijo utilizado para asignar los nombres. Por ejemplo, el prefijo `"segment_"` produciría archivos llamados `"segment_0.ts"`, `"segment_1.ts"` y así sucesivamente. Es opcional y su valor predeterminado es el nombre base del archivo de entrada. Consulta también el parámetro relacionado `segment_name`.

* `segment_name`: El nombre utilizado para el segmento final. Las variables disponibles son `${segment_prefix}`, `${segment_number}` y `${segment_id}` (que es un UUIDv4 sin guiones).

* `segment_time_delta`: Desfase que se aplicará a la duración del segmento. Es opcional y permite ajustar con precisión los límites de los segmentos.

* `font_size`

* `font_color`

* `text_background_color`
