tb-multimedia

1.2.5 • Public • Published

tb-multimedia Reference

Este módulo ofrece distintas funcionalidades multimedia. Algunas de ellas son:

  • Streaming de video
  • Edición de imágenes

Instalación y configuración

IMPORTANTE: Algunas de las funciones de tb-multimedia, como la edición de imágenes, requieren tener instalado Graphic's Magick e ImageMagick en el servidor.

Para más información sobre cómo instalarlo consultar la página web: http://www.graphicsmagick.org

En primer lugar vamos a explicar como se realiza la configuración del módulo para poder utilizarlo, aunque no todas las funciones requieren de ella.

Además es importante inicializar la librería en el archivo "boot.js" dentro de app para que estén disponibles los distintos modelos que ofrece el módulo. Para ello incluir la siguiente linea de código dentro de la función Boot:

App.Multimedia.init();

- Configuración manual:

La configuración manual del módulo se realiza en el archivo "config.json" que se encuentra en la carpeta "app". Para ello es necesario agregar un objeto cuya clave sea "multimediaOptions", donde se configurarán las distintas funcionalidades que lo necesiten.

  • Ejemplo:
...
"multimediaOptions": {
  ...
}
...

Video streaming

Transformar un video en formato de Streaming permite que el cliente descargue el vídeo “por partes” pequeñas y pueda comenzar a reproducirlo sin tener que descargar el archivo por completo. Para ello, se recibe un vídeo en cualquier formato, y éste se transforma a formatos compatibles con streaming reproducibles en iOS (HLSv4), Android (MPEG-DASH) y Web (MPEG-DASH for web).

Para transformar vídeos a streaming, se deben seguir 2 pasos:

1 - Solicitar transformación a streaming. Esto crea un job (una solicitud de trabajo), que puede tomar pocos segundos o varios minutos dependiendo de la longitud del vídeo.

2 - Solicitar el estado del job creado con anterioridad. Una vez que el job esté listo, los archivos estarán disponibles para ser reproducidos en streaming.

Para configurar el servicio de streaming, en el objeto de configuración de multimedia ("multimediaOptions"), hay que añadir un objeto llamado "transcoder" que contendrá credenciales del servicio AWS de Amazon necesarias. El objeto será de la siguiente manera:

  ...
  "multimediaOptions": {
    "transcoder":{
      "accessKeyId": "……",
      "secretAccessKey": "……"
    }
  }
  ...

Solicitud de Streaming

En la solicitud de Streaming se especifica el video de entrada y el formato y configuración del video de salida.

El archivo de entrada puede estar alojado en alguno de los servicios de almacenamiento soportados por el módulo tb-storage (“local”, “gcloud”, “aws”), o puede ser tomado de una URL pública que contenga un archivo de vídeo.

La salida del streaming es un conjunto de archivos, y su formato, calidad y estructura depende de las plataformas destino y la variedad de calidades deseada. Dichos archivos siempre serán públicos para que puedan ser reproducidos directamente desde su ubicación.

La respuesta de la solicitud retorna un “job id”, o identificador del trabajo de streaming que se está realizando. Se debe utilizar este id para consultar el estado del proceso posteriormente.

NOTA: Para más información sobre el módulo de almacenamiento tb-storage consultar la siguiente URL: "https://github.com/toroback/tb-storage"

- Solicitud y Parámetros

La solicitud se puede realizar mediante la REST Api, realizando una petición POST a la siguiente URL:

https://a2server.a2system.net:XXXX/api/v1/srv/multimedia/streaming

ó utilizando la Class Api de la siguiente manera:

  var pamatetros = {...};
  var multimedia = new App.Multimedia();
  multimedia.streaming(parametros)
  .then(res =>{ … })
  .catch(err => { … });

• Parámetros de la solicitud:

- Objeto de entrada:

Clave Tipo Opcional Descripción
input Object Contiene la información de donde tomar el video de entrada
input.service String Servicio de almacenamiento (valores: local, gcloud, aws, url)
input.container String Nombre del Bucket en el servicio. No requerido si service=url
input.path String Path al archivo, relativo al bucket. Si service = url, es la URL completa del archivo.

- Objeto de salida:

Clave Tipo Opcional Descripción
output Object Configuración de salida, dónde ubicar los archivos y playlists del straming.
output.service String Servicio de almacenamiento (valores: local, gcloud, aws)
output.container String Nombre del Bucket en el servicio. Debe existir.
output.pathPrefix String Prefijo de ruta donde ubicar los archivos de salida. Relativo al bucket
output.targets Array Plataformas para las que se va a realizar el Streaming. (valores: IOS, ANDROID, WEB_MPEG_DASH)
output.qualities Array Resoluciones de video en que estará disponible la salida. (valores: SD, HD, FHD, UHD)
output.thumbnail Bool X Indica si hay que generar un thumbnail. Por defecto es false

• Parámetros de la respuesta:

Clave Tipo Opcional Descripción
id String Identificador del trabajo de streaming asociado a la petición.
status String Estado de procesamiento del trabajo (valores: "processing", "complete", "error")

- Ejemplo REST 1: Video de URL

POST: https://a2server.a2system.net:1234/api/v1/srv/multimedia/streaming

Body:

{
  "input": {
    "service": "url",
    "path": "http://www.sample-videos.com/video/mp4/360/big_buck_bunny_360p_5mb.mp4"
  },
  "output": {
    "service": "aws",
    "container": "micontenedor",
    "pathPrefix": "test-streaming/prueba-1",
    "targets": ["IOS", "ANDROID"],
    "qualities": ["SD", "HD"],
    "thumbnail": true
  }
}

Respuesta:

{
  "id": "1504485209559-bwzg66",
  "status": "processing"
}

- Ejemplo REST 2: Video en almacenamiento tb-storage

POST: https://a2server.a2system.net:1234/api/v1/srv/multimedia/streaming

Body:

{
  "input": {
    "service": "local",
    "container": "videos",
    "path": "user/123456789"
  },
  "output": {
    "service": "aws",
    "container": "micontenedor",
    "pathPrefix": "test-streaming/prueba-2",
    "targets": ["IOS", "ANDROID"],
    "qualities": ["SD", "HD"],
    "thumbnail": true
  }
}

Respuesta:

{
  "id": "1504485209559-bwzg77",
  "status": "processing"
}

Consultar estado de procesamiento

Con el id recibido en el comando anterior, se puede consultar el estado del trabajo de streaming solicitado. Cuando el proceso termine, el estado del trabajo cambiará a “complete” y se recibirá la información de los archivos.

- Solicitud y Parámetros

La solicitud se puede realizar mediante la REST Api, realizando una petición GET a la siguiente URL:

https://a2server.a2system.net:XXXX/api/v1/srv/multimedia/streaming/<id_trabajo>

ó utilizando la Class Api de la siguiente manera:

  var jobId = " … ";
  var multimedia = new App.Multimedia();
  multimedia.readJob(jobId)
  .then(res =>{ … })
  .catch(err => { … });

• Parámetros de la solicitud:

Clave Tipo Opcional Descripción
jobId String Identificador del trabajo de streaming

• Parámetros de la respuesta:

Clave Tipo Opcional Descripción
id String Identificador del trabajo de streaming asociado a la petición.
status String Estado de procesamiento del trabajo (valores: "processing", "complete", "error")
outputs Array Array con los archivos del streaming especificos para cada plataforma.
outputs.target String Plataforma destinada del archivo
outputs.playlist String PlayList del streaming
outputs.thumbnail String Thumbnail del video

- Ejemplo REST

GET: https://a2server.a2system.net:1234/api/v1/srv/multimedia/streaming/1504485209559-bwzg66

Respuesta:

{
  "id": "1504485209559-bwzg66",
  "status": "complete",
  "outputs": [
    {
      "target": "IOS",
      "playlist": "https://s3.eu-central-1.amazonaws.com/micontenedor/test-streaming/prueba-1/hls/playlist.m3u8",
      "thumbnail": "https://s3.eu-central-1.amazonaws.com/micontenedor/test-streaming/prueba-1/hls/60x108-00001.png",
 
    },
    {
      "target": "ANDROID",
      "playlist": "https://s3.eu-central-1.amazonaws.com/micontenedor/test-streaming/prueba-1/mpeg-dash/playlist.mpd",
      "thumbnail": "https://s3.eu-central-1.amazonaws.com/micontenedor/test-streaming/prueba-1/mpeg-dash/60x108-00001.png"
    }
  ]
}

Edición de imágenes

Las funciones de edición de imágenes permiten realizar las siguientes opciones:

  • Optimizar
  • Redimensionar imagen
  • Crop de imagen
  • Rotar

Todas estas opciones se pueden realizar por separado o en conjunto sobre una misma imagen.

La edición de imágenes no necesita de configuración previa obligatoria para todas las opciones pero sí requiere las funciones de GraphicsMagic/ImageMagick.

La opción que requiere configuración es la optimización de imágenes si se requiere uso de servicios de terceros. Para ello, dentro del objeto de configuración del módulo, se necesita añadir un objeto con la siguiente estructura, donde se realizarán las configuraciones necesarias:

  ...
  "multimediaOptions": {
    "editor":{
      
    }
  }
  ...

Optimización de imagen

Para que una imagen ocupe menos espacio en disco se puede optimizar para reducir su tamaño. Este proceso se puede realizar de manera local, en el servidor, o utilizando algun servicio web de optimización de imágenes. Para ello, si se quiere utilizar servicios externos a Toroback, es necesario configurar dicho servicio en el objeto "editor" de la configuración del módulo.

Por el momento el único servicio externo es TinyPNG. Que para configurarlo es necesario añadir el siguiente objeto:

  ...
  "tinyPng":{
    "apikey": myApiKey,
    "optimization":false
  }
  ...

En el que se especifica el ApiKey proporcionado por el servicio y si dicho servicio será utilizado por defecto para optimización o no.

Un ejemplo de configuración sería el siguiente:

  ...
  "multimediaOptions": {
    "editor":{
      "tinyPng":{
        "apikey": "wNX4NMPCX5Vmn7XC3nCCQ7MXXt8Gxxxh",
        "optimization":true
      }
    }
  }
  ...

Solicitud de edición de imagen

Para editar una imagen es necesario especificar un archivo de entrada, las opciones de edición y el archivo de salida.

Para realizar la edición de una imagen se puede utilizar el REST Api realizando una petición POST a la siguiente URL:

https://a2server.a2system.net:XXXX/api/v1/srv/multimedia/editImage

ó utilizando la Class Api de la siguiente manera:

  var input = { … }; // Imagen de entrada
  var options = { … }; // Opciones de edición
  var output = { … }; // Configuración de salida
 
  var multimedia = new App.Multimedia();
 
  multimedia.editImage(input, output, options) 
  .then(res =>{ … })
  .catch(err => { … });
 

- Parámetros

• Parámetros de la solicitud:

- Objeto de entrada:

Clave Tipo Opcional Descripción
input Object Contiene la información de donde tomar la imagen de entrada
input.service String Servicio del que cargar el archivo (gcloud, local, aws, url).
input.container String X Contedor del archivo. Solo para los servicios de almacenamiento. No es necesario para service="url"
input.path String Path del archivo relativo al contenedor para servicios de almacenamiento o url si es service="url"

- Objeto de salida:

Clave Tipo Opcional Descripción
output Object Configuración de salida, dónde ubicar la imagen editada.
output.service String Servicio de almacenamiento (valores: local, gcloud, aws)
output.container String Nombre del Bucket en el servicio. Debe existir.
output.pathPrefix String Prefijo de ruta donde ubicar los archivos de salida. Relativo al bucket.
output.public Boolean Indica si el archivo de salida debe ser público o no.

- Opciones de edición:

Clave Tipo Opcional Descripción
image Object Objeto con las modificaciones a realizar sobre la imagen.
image.optimize Boolean X True para realizar optimización de imagen
image.crop String X Tipo de crop que aplicar a la imagen (valores: squared, rounded).
image.rotate Number X Rotación a aplicar a la imagen en grados. (Ej. 90, 270, 180).
image.resize Array X Array con los tamaños de la imagen a generar. (valores: t, s, m, l, xl)
image.force Boolean X True para forzar la redimension a los tamaños indicados, sino como máximo será el tamaño de la imagen original

• Parámetros de la respuesta:

Clave Tipo Opcional Descripción
images Array Array con la información de las imágenes generadas tras la edición.
images.service String Servicio de almacenamiento (valores: local, gcloud, aws).
images.container String Nombre del Bucket en el servicio.
images.path String Path al archivo, relativo al bucket.
images.public Boolean Indica si el archivo es público o no.
images.url String URL de la imagen.
images.size String Tamaño de la imagen. (valores: t, s, m, l, xl)

- Ejemplo: Rotar imagen

El siguiente ejemplo muestra cómo rotar una imagen. Para ello se tomará una imagen del almacenamiento local cuyo contenedor es "test-container". La imagen se llama pic.png Una vez editada la imagen, los archivos generados serán almacenados en el servicio de almacenamiento "gcloud" dentro del contenedor "gcloud-container" en el subpath "modified/". Dicha imagen será pública.

En este caso la imagen será rotada 90 grados en el sentido de las agujas del reloj.

POST: https://a2server.a2system.net:1234/api/v1/srv/multimedia/editImage

Body:

{
  "input":{ 
    "service": "local", 
    "container": "test-container", 
    "path": "pic.png"
  },
  "image":{
    "rotate": 90
  },
  "output":{
    "service":"gcloud", 
    "container":"gcloud-container", 
    "pathPrefix": "modified/", 
    "public":true
  }
 
}

Respuesta:

{
  "images": [
    {
      "path": "modified/rotate.png",
      "service": "gcloud",
      "container": "gcloud-container",
      "public": true,
      "url": "https://s3.eu-central-1.amazonaws.com/gcloud-container/modified/<fileName>"
    }
  ]
}

- Ejemplo: Rotar + Crop de imagen

El siguiente ejemplo muestra cómo crear el crop de una imagen. Para ello se tomará una imagen del almacenamiento local cuyo contenedor es "test-container". La imagen se llama pic.png Una vez editada la imagen, los archivos generados serán almacenados en el servicio de almacenamiento "gcloud" dentro del contenedor "gcloud-container" en el subpath "modified/". Dicha imagen será pública.

En este caso la imagen será rotada 90 grados en el sentido de las agujas del reloj y además se hará crop de la misma.

POST: https://a2server.a2system.net:1234/api/v1/srv/multimedia/editImage

Body:

{
  "input":{ 
    "service": "local", 
    "container": "test-container", 
    "path": "pic.png"
  },
  "image":{
    "rotate": 90,
    "crop": "squared"
  },
  "output":{
    "service":"gcloud", 
    "container":"gcloud-container", 
    "pathPrefix": "modified/", 
    "public":true
  }
 
}

Respuesta:

{
  "images": [
    {
      "path": "modified/crop.png",
      "service": "gcloud",
      "container": "gcloud-container",
      "public": true,
      "url": "https://s3.eu-central-1.amazonaws.com/gcloud-container/modified/<fileName>"
    }
  ]
}

- Ejemplo: Rotar + Optimizar imagen desde url

El siguiente ejemplo muestra cómo optimizar y rotar una imagen tomada desde una url. Para ello se pasará la url del archivo que se vaya a editar. Una vez editada la imagen, los archivos generados serán almacenados en el servicio de almacenamiento "gcloud" dentro del contenedor "gcloud-container" en el subpath "modified/". Dicha imagen será pública.

En este caso la imagen será rotada 90 grados en el sentido de las agujas del reloj.

POST: https://a2server.a2system.net:1234/api/v1/srv/multimedia/editImage

Body:

{
  "input":{ 
    "service": "url", 
    "path": <myImageUrl>
  },
  "image":{
    "optimize": true
    "rotate": 90
  },
  "output":{
    "service":"gcloud", 
    "container":"gcloud-container", 
    "pathPrefix": "modified/", 
    "public":true
  }
 
}

Respuesta:

{
  "images": [
    {
      "path": "modified/rotate.png",
      "service": "gcloud",
      "container": "gcloud-container",
      "public": true,
      "url": "https://s3.eu-central-1.amazonaws.com/gcloud-container/modified/<fileName>"
    }
  ]
}

Subida de imágenes con edición

Esta función permite subir un archivo e indicar de manera sencilla la ubicación en la que se almacenará y la edición a aplicar. Esto se realiza usando unas referencias previamente declaradas que contendrán esa información.

La declaración de una referencia se realiza en el archivo "config.json" del proyecto, en el objeto "multimediaOptions.editor". Para más informacion ver la sección "Configuración manual".

Para ello hay que agregar un objeto "references" que contendrá dichas referencias representadas por objetos, donde el key de cada subobjeto será el identificador de la referencia. Cada referencia es un objeto que contendrá una referencia de almacenamiento utilizada por el módulo "Storage" y un array llamado "editOptions" que contendrá tantos objetos con los distintos parámetros que se pueden utilizar en la sección "Edición de Imágenes" como ediciones se quieren aplicar.

Un ejemplo es el siguiente:

{
  ...
 
  "multimediaOptions":{
    "editor":{
      ...
      "references": {
        "myRef1": {
          "storageReference": "myStorageReference",
          "editOptions": [{ "optimize":true, "crop": "rounded", "resize": ["t", "s", "m"] }]
        }
      }
      ...
    }
  }
 
  ...
}

• REST Api:

Petición:

HTTP Method URL
POST Multipart https://[domain]:[port]/api/v[apiVersion]/srv/multimedia/upload?reference=<reference>[&public=<true,false>]

Parámetros del query:

Clave Tipo Opcional Descripción
reference String X Referencia a la ubicación y a las transformaciones que se van a aplicar. (Para más información ver "Uso de Referencias" del modulo Storage)
public Boolean X Flag que indica si el archivo va a ser público. Por defecto es false.

Parámetros Multipart:

Clave Tipo Opcional Descripción
path String Path destino relativo al contenedor del archivo que se va a subir incluyendo el nombre y extensión del mismo.
fileUpload File Archivo que se va a subir.

NOTA: Es necesario pasar una de las dos opciones. Servicio y contenedor ó referencia.

Respuesta:

Clave Tipo Opcional Descripción
file tb.multimedia-files Objeto con la información del archivo subido

Ejemplo:

  • POST:

https://a2server.a2system.net:1234/api/v1/srv/multimedia/upload?reference=myRef1&public=true

  • DATOS multipart:
 "path" : "subfolder/file.png"
 "fileUpload": El archivo a subir

Declaración de tamaños.

Por defecto existen los siguientes tamaños predefinidos :

  t:  { w: 160, h: 160 },
  s:  { w: 240, h: 240 },
  m:  { w: 640, h: 640 },
  l:  { w: 1280, h: 1280 },
  xl: { w: 1600, h: 1600 }

Pero se pueden declarar nuevos tamaños a utilizar declarándolos en el archivo "config.json" del proyecto, en el objeto "multimediaOptions.editor". Para más informacion ver la sección "Configuración manual".

Para ello es necesario añadir un objeto "sizes" que contendrá pares clave-valor donde la clave será el identificador del tamaño y el valor será un String con las dimensiones con el siguiente formato "WxH".

Un ejemplo es el siguiente:

{
  ...
 
  "multimediaOptions":{
    "editor":{
      ...
      "sizes": {
        "mySize1": "500x500",
        "mySize2": "750x750"
      }
      ...
    }
  }
 
  ...
}

Para utilizarlas se puede añadir el identificador al array de tamaños "resize" utilizado en la edición de imágenes

Package Sidebar

Install

npm i tb-multimedia

Weekly Downloads

1

Version

1.2.5

License

ISC

Unpacked Size

108 kB

Total Files

12

Last publish

Collaborators

  • a2system
  • ezefire
  • filianer
  • javierarpa
  • maganap