Upload
david-fernandez-lopez
View
138
Download
9
Embed Size (px)
Citation preview
Real-time Multimedia Stream Processing
Developing rich multimedia applications with Kurento Desarrollando filtros para Kurento
[email protected]://www.kurento.org
Open APIs for Open Minds
¿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
¿Qué es un filtro?
KMS
3
Media PipelineMedia Pipeline
Sin
kS
ink
SR
CS
RC
Sin
kS
ink
SR
CS
RC
Sin
kS
ink
SR
CS
RC
¿Qué es un filtro?
KMS
4
Sin
kS
ink
SR
CS
RC
Sin
kS
ink
Sin
kS
ink
SR
CS
RC
Sin
kS
ink
SR
CS
RC
Sin
kS
ink
SR
CS
RC
Sin
kS
ink
SR
CS
RC
WebRtcEndpoint
MirrorFilter PointerDetectorFilter
ChromaFilter FaceOverlayFilter
Media Pipeline
Events (buttons)Change faceChange background
Arquitectura de Kurento
5
Kurento Media ServerKurento Media Server
Capa de transporte ( Apache Thrift)Capa de transporte ( Apache Thrift)
Kurento APIsKurento APIs
ClientesClientes
RecubrimientoRecubrimientoC++C++
ElementosElementosGStreamerGStreamer
KURENTOKURENTOMODELMODEL
DESCRIPTORDESCRIPTOR
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.
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.
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
Desarrollando un filtro para Gstreamer con OpenCV
● Estructura del proyecto.
9
Desarrollando un filtro para Gstreamer con OpenCV
KMS
10
Desarrollando un filtro para Gstreamer con OpenCV
KMS
11
Desarrollando un filtro para Gstreamer con OpenCV
KMS
12
Desarrollando un filtro para Gstreamer con OpenCV
KMS
13
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
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
Generando un módulo para Kurento
● Kurento Model Descriptor (kmd)
16
Generando un módulo para Kurento
17
● Fichero CMakeLists.txt
● 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
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
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
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
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
Generando un módulo para Kurento● Desarrollo en la parte C++
23
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
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);
}
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
Para colaborar con Kurentohttp://www.github.com/kurento
Muchas gracias por vuestra atención
27