Este documento describe cómo desarrollar filtros multimedia para la plataforma Kurento. Explica qué es un filtro, la arquitectura de Kurento, y cómo utilizar las librerías GStreamer y OpenCV para crear un filtro. Además, detalla el proceso de generar un módulo para Kurento usando la herramienta kurento-module-tool y cómo usar el filtro en aplicaciones cliente de Java y JavaScript.
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
Desarrollando filtros para Kurento
1. Real-time Multimedia Stream Processing
Developing rich multimedia applications with Kurento
Desarrollando filtros para Kurento
d.fernandezlop@gmail.com
http://www.kurento.org
Open APIs for Open Minds
2. ¿Qué es un filtro?
• Es un MediaElement con una entrada y n
salidas.
• Permite procesar frame a frame todo el
flujo de media.
– Recibe media.
– Procesa las imágenes.
– Envía el media a n destinatarios.
KMS
2
3. ¿Qué es un filtro?
KMS
3
Media PipelineMedia Pipeline
SinkSinkSRCSRC
SinkSink
SRCSRC
SinkSink
SRCSRC
4. ¿Qué es un filtro?
KMS
4
SinkSinkSRCSRC
SinkSink
SinkSink
SRCSRC
SinkSink
SRCSRC
SinkSink
SRCSRC
SinkSink
SRCSRC
WebRtcEndpoint
MirrorFilter PointerDetectorFilter
ChromaFilter FaceOverlayFilter
Media Pipeline
Events (buttons)Change faceChange background
5. Arquitectura de Kurento
5
Kurento Media ServerKurento Media Server
Capa de transporte ( Apache Thrift)Capa de transporte ( Apache Thrift)
Kurento APIsKurento APIs
ClientesClientes
RecubrimientoRecubrimiento
C++C++
ElementosElementos
GStreamerGStreamer
KURENTOKURENTO
MODELMODEL
DESCRIPTORDESCRIPTOR
6. GStreamer
6
●
Librería C para el desarrollo de
aplicaciones multimedia.
●
Incluye elementos para reproducir y
manejar diferentes tipos de media.
●
Desarrollo basado en módulos.
●
Gran comunidad de desarrolladores.
7. OpenCV
7
●
Librería C/C++ para el desarrollo de
aplicaciones de visión artificial.
●
Facilita el acceso a la información de
una imagen.
●
Gran número de métodos
implementados.
●
En constante desarrollo.
●
Mucho código en internet.
8. Desarrollando un filtro para
Gstreamer con OpenCV
●
Independiente de la arquitectura de
Kurento.
●
Basado en el proyecto
kms-plugin-sample disponible en:
http://github.com/Kurento/kms-plugin-sample
8
14. Desarrollando un filtro para
Gstreamer con OpenCV
KMS
14
●
Para probar nuestro filtro:
●
gst-launch-1.0 --gst-plugin-path=. v4l2src ! videoconvert !
samplefilter type=1 ! videoconvert ! autovideosink
15. Generando un módulo para Kurento
●
Kurento Model Descriptor (kmd)
– Fichero en formato JSON que describe
nuestro módulo.
– En él se describen el constructor, los
métodos y las propiedades del filtro.
– Además se especifica la versión del
módulo y sus dependencias.
*Disponible a partir de Kurento 5.0.0
15
18. ●
Kurento-module-tool + kmd + CMakeLists
– Código C++
●
Código de pegamento.
●
Implementación inicial de las clases del módulo.
– Código Java
– Código JavaScript
18
Generando un módulo para Kurento
19. Generando un módulo para Kurento
●
Kurento-module-tool + kmd + CMakeLists
– Código C++
●
Código de pegamento.
●
Implementación inicial de las clases del módulo.
– Código Java
– Código JavaScript
19
20. Generando un módulo para Kurento
●
Kurento-module-tool + kmd + CMakeLists
– Código C++
●
Código de pegamento.
●
Implementación inicial de las clases del módulo.
– Código Java
– Código JavaScript
20
21. Generando un módulo para Kurento
●
Kurento-module-tool + kmd + CMakeLists
– Código C++
●
Código de pegamento.
●
Implementación inicial de las clases del módulo.
– Código Java
– Código JavaScript
21
22. Generando un módulo para Kurento
●
Kurento-module-tool + kmd + CMakeLists
– Código C++
●
Código de pegamento.
●
Implementación inicial de las clases del módulo.
– Código Java
– Código JavaScript
22
24. Generando un módulo para Kurento
●
Generación de código cliente
– Generar el código cliente para acceder
desde las APIs de Kurento.
●
Generar código Java y empaquetarlo
utilizando maven.
●
Generar código JavaScript y
empaquetarlo utilizando npm.
24
25. Uso en aplicaciones cliente
●
Uso en Java
25
public void onContentRequest(WebRtcContentSession contentSession) throws
Exception {
MediaPipeline mp = contentSession.getMediaPipelineFactory().create();
contentSession.releaseOnTerminate(mp);
WebRtcEndpoint webRtcEndpoint = new WebRtcEndpoint().Builder(mp).build();
SamplePlugin samplePlugin = new SamplePlugin().Builder(mp).build();
samplePlugin.setFilterType (1);
samplePlugin.setEdgeThreshold (125);
webRtcEndpoint.connect (samplePlugin);
samplePlugin.connect (webRtcEndpoint);
contentSession.start (webRtcEndpoint);
}
26. Uso en aplicaciones cliente
●
Uso en JavaScript*
26
var kwsMedia = yield KwsMedia(ws_uri);
var pipeline = yield kwsMedia.create("MediaPipeline");
var webRtc = yield pipeline.create("WebRtcEndpoint");
var filter = yield pipeline.create("SamplePlugin");
yield filter.setFilterType(1);
yield filter.setEdgeThreshold(125);
var answer = yield webRtc.processOffer(offer);
webRtcPeer.processSdpAnswer(answer);
yield webRtc.connect(filter);
yield filter.connect(webRtc);
*Utilizando generators de ECMAScript 6
27. Para colaborar con Kurento
http://www.github.com/kurento
Muchas gracias por vuestra atención
d.fernandezlop@gmail.com
27