SlideShare una empresa de Scribd logo
1 de 43
www.kurento.org
Real-time Multimedia Stream Processing
Developing rich multimedia applications with KurentoDeveloping rich multimedia applications
with Kurento: a tutorial for Java
developers
lulop@kurento.org
http://www.kurento.org
www.kurento.org
Multimedia infrastructures for the
Future Internet
Media is
here
Media got
there
Media got
there
Analyze
Transform
Store
Transport
Enrich
Augment
Adapt
Sensors
Context
Events
Media is
here
2
www.kurento.org
Enrich, augment, adapt, analyze,
transform, store: what’s the problem?
Complexity
3
www.kurento.org
Future
Internet
Multimedia
Infrastructure
Simple
Development
APIs
Kurento: the equation
4
www.kurento.org
•Interoperable media exchange (multiplatform/multiprotocol)
•WebRTC, RTP, HTTP (video tag), etc.
•Process media (Computer vision, augmented reality, media indexing, etc.)
•Media and metadata recording and recovery
•Transform and adapt media (H.264, H.263, VP8, Ogg, and others)
•Media routing and mixing
•Etc.
Multimedia infrastructure
• REST API
• JavaScript API
• Java API
APIs
• LGPL 2.1
Is distributed through a flexible FOSS license
What’s Kurento
5
www.kurento.org
Kurento Media Server (KMS): the
nucleus of Kurento
• KMS is a middleware for media streams
– Receives the stream
– Process the stream
– Issues the stream
Send
Receive
Analyze
Augment
Enrich
Transform
Transcode
Record
Process
Replicate
Media
Source
Media
Sink
KMS
6
www.kurento.org
The Media API: The API for accessing
KMS capabilities
Send
Receive
Analyze
Augment
Enrich
Transform
Transcode
Record
Process
Replicate
Media
Source
Media
Sink
KMS
Java
Media API
JavaScript
Media API
REST
API
Applications define the processing
of streams getting through KMS
7
www.kurento.org
Media API: Media Elements and Media
Pipelines
SinkSRC
Sink
SRC
SRCSink
Sink
Media Element
• Provides a specific media
functionality
› Send/receive media
› Process media
› Transform media
• Exchange media through
› Sources
› Sinks
Media pipeline
• Chain of media elements
implementing the desired media
logic.
• The Media API provides the
capability of creating media
pipelines by joining media
elements of the toolbox
Media Element
Sink
SRC
8
www.kurento.org
Media API: trivial example (Java)
MediaPipeline mp = contentSession.getMediaPipelineFactory().create();
PlayerEndpoint playerEndpoint = mp.newPlayerEndpoint(file:///myFile.webm).build();
HttpGetEndpoint httpEndpoint = mp.newHttpGetEndpoint().terminateOnEOS().build();
playerEndpoint.connect(httpEndpoint);
httpEndpoint.getUrl(); //URL where the media is made available
Media Pipeline (inside KMS)
HttpGetEndpoint
Media from
file or URI
HTTP media
streaming
Sink
SRC
PlayerEndpoint
9
www.kurento.org
Is that enough? Think about the WWW
development model
Process WWW request
- DDBB access
- Authentication
- XML processing
- Etc.
HTTP request:
I want this resource
HTTP response:
The resource
• Intuition behind the WWW model
– Client asks what it wants
• GET /this_resource HTTP/1.1
– Server side APIs execute the associated processing
You develop this using …
• Servlet
• JSP
• ASP
• PHP
• Ruby on Rails
• CGI
• Etc.
10
www.kurento.org
We need an equivalent model: the role
of the Signaling Plane
• We need “something” with the capability of negotiating what,
when and how media is exchanged
• A protocol for “saying”
– I want “this media” …
• Identification of the media to exchange
– File in hard-drive, IP camera, user, etc.
– in “this way” …
• Identification of the processing of media
– Augmented, analyzed, etc.
– with “this format” …
• Quality
– Codec, screen-size, frame-rate, etc.
– at “this moment”
• Stream control
– Play, stop, start, pause, etc.
11
www.kurento.org
Don’t get it? think about WWW
development again …
Process WWW request
- DDBB access
- Authentication
- XML processing
- Etc.
HTTP request:
I want this resource
HTTP response:
The resource
Process media request
- Media API
- DDBB access
- Authentication
- XML processing
- Etc.
Signaling request:
I want this media
Signaling response:
The media is here
This is how you
create WWW
applications
(Servlets, ASP, PHP,
Rails, etc.)
This is how you create
Kurento enabled
applications:
Multimedia RTC is just
another feature of your
application
You, as a
programmer,
create this
12
www.kurento.org
Abstracting the signaling plane: The
Content Handler
KMS
SinkSRC
Sink
SRC
Sink
SRCSink
Media API
REST API (Open API protocol) The Content Handler
Equivalent to a Servlet/ASP/PHP script
Exposes APIs for specifying:
- when receiving “this request”…
- … execute “this logic”
Developer can use the media API
Code building the media pipeline and
executing the application logic the
developer wants
13
www.kurento.org
Kurento Application Server: The
container of Handlers
• Is an extension of Java EE technologies.
• Compatible with all Java EE Servlet
containers
• Hold Handlers
– Your specific application code
• Receives signaling requests:
– I want “this media” in this way …
• Dispatches request to the appropriate
handler
– @annotations based mapping
• Generate an answer showing “where
and how to find the media”
– URL where media is located
– Negotiated SDP
Java EE compatible container
HTTP
Servlet
SIP
Servlet
Web
service
s
Kurento
REST API
Specific handler implementations
Media API DD.BB.
Kurento Application Server (KAS)
Other java
APIs.
14
www.kurento.org
Kurento Architecture: putting it all
together
Kurento Media Server (KMS)
Receive
Video
Augmented
Reality
Send
Video
Computer
Vision
Video Playing
and Recording
Java EE compatible container
HTTP
Servlet
SIP
Servlet
Web
service
s
Kurento
REST API
Specific handler implementations
Signaling and
WWW traffic
Media
Media
Signaling and
WWW traffic
Media API DD.BB.
Kurento Application Server (KAS)
Other java
APIs.
15
www.kurento.org
Application execution flow
Client
Code
Application
Server (KAS)
Media
Server (KMS)
I want this media in this way …
(JSON-RPC request)
Commands requesting
the creation of a pipeline
What you want is here …
(JSON-RPC answer)
Media
negotiation
phase
Media
exchange
phase
1
2
Specific application
logic at the
server-side
(Content Handler)
Media
pipeline
creation
Media exchange between client and server
16
www.kurento.org
Content Handler: trivial example
//Specify the type of service provided by this handler: Player, Recorder, WebRTC, RTP, etc.
@HttpPlayerService(path = "/player”) //Mapping of handler specified in path
public class MyPlayerHandler extends HttpPlayerHandler {
@Override
public void onContentRequest(HttpPlayerSession contentSession) {
//Thie client wants the media this handler provides
//Create the pipeline for providing the media
}
@Override
public void onContentStarted(HttpPlayerSession contentSession) {
//Media started flowing, you can execute additional actions
}
@Override
Public void onSessionTerminated(HttpPlayerSession contentSenssion){
//Media exchange termianted, you can collect your resources
}
17
www.kurento.org
Let’s develop with Kurento
• What you need
– A Kurento instance
• You can install your own Kurento instance
• You can launch a Kurento instance at the FI-LAB (FI-WARE project)
– http://lab.fi-ware.org
• Getting help
– Kurento web site
• http://www.kurento.org
– Kurento mailing list
• https://groups.google.com/forum/#!forum/kurento
– Twitter
• @kurentoms
18
www.kurento.org
Kurento Hello World: Playing a file
with an HTML5 client
Media Pipeline
HttpGetEndpoint
Media from
file or URI
HTTP media
streaming
Sink
SRC
PlayerEndpoint
Media API
REST API (Open API protocol)
Handler codeI want
“this media”
Media is
“at this URL”
19
www.kurento.org
Playing a file with an HTML5 client:
Handler code@HttpPlayerService(path = "/player”)
public class MyPlayerHandler extends HttpPlayerHandler {
@Override
public void onContentRequest(HttpPlayerSession contentSession) throws Exception {
MediaPipeline mp = contentSession.getMediaPipelineFactory().create();
contentSession.releaseOnTerminate(mp);
PlayerEndpoint playerEndpoint = mp.newPlayerEndpoint(
"http://media.w3.org/2010/05/sintel/trailer.webm").build();
contentSession.setAttribute("player", playerEndpoint);
HttpGetEndpoint httpEndpoint = mp.newHttpGetEndpoint().terminateOnEOS().build();
playerEndpoint.connect(httpEndpoint);
contentSession.start(httpEndpoint);
}
@Override
public void onContentStarted(HttpPlayerSession contentSession) {
PlayerEndpoint playerEndpoint = (PlayerEndpoint) contentSession.getAttribute("player");
playerEndpoint.play();
}
}
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/java/com/kurento/tutorial/MyPlayerHandler.java
20
www.kurento.org
Playing a file with an HTML5 client:
client code<!DOCTYPE html>
<html>
<head>
<script src="./js/kws-content-api.js"></script>
<script>
var conn;
function start() {
var options = {
remoteVideoTag : "remoteVideo"
};
conn = new kwsContentApi.KwsContentPlayer("./player", options);
}
function terminate() {
conn.terminate();
}
</script>
</head>
<body>
<button onclick="start();">Start</button>
<button onclick="terminate();">Terminate</button>
<br />
<video id="remoteVideo" autoplay></video>
</body>
</html>
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/webapp/player.html
21
www.kurento.org
Playing a file with an HTML5 client:
See the example working
https://www.youtube.com/watch?v=n5BQlhYgGSo
22
www.kurento.org
Media Pipeline
Adding Computer Vision
HttpGetEndpoint
Media
from
file or
URI
HTTP media
streaming
Sink
SRC
PlayerEndpoint
SRC
Sink
JackVaderFilter
Media API
REST API (Open API protocol)
Handler codeI want
“this media”
Media is
“at this URL”
23
www.kurento.org
Adding Computer Vision: Handler code
@HttpPlayerService(path = "/playerWithFilter”)
public class MyPlayerHandler extends HttpPlayerHandler {
@Override
public void onContentRequest(HttpPlayerSession contentSession) throws Exception {
MediaPipeline mp = contentSession.getMediaPipelineFactory().create();
contentSession.releaseOnTerminate(mp);
PlayerEndpoint playerEndpoint = mp.newPlayerEndpoint(
"http://media.w3.org/2010/05/sintel/trailer.webm").build();
contentSession.setAttribute("player", playerEndpoint);
JackVaderFilter filter = mp.newJackVaderFilter().build();
HttpGetEndpoint httpEndpoint = mp.newHttpGetEndpoint().terminateOnEOS().build();
filter.connect(httpEndpoint);
playerEndpoint.connect(filter);
contentSession.start(httpEndpoint);
}
@Override
public void onContentStarted(HttpPlayerSession contentSession) {
PlayerEndpoint playerEndpoint = (PlayerEndpoint) contentSession.getAttribute("player");
playerEndpoint.play();
}
}
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/java/com/kurento/tutorial/MyPlayerWithFilter.java
24
www.kurento.org
Adding Computer Vision: Client code
<!DOCTYPE html>
<html>
<head>
<script src="./js/kws-content-api.js"></script>
<script>
var conn;
function start() {
var options = {
remoteVideoTag : "remoteVideo"
};
conn = new kwsContentApi.KwsContentPlayer("./playerWithFilter", options);
}
function terminate() {
conn.terminate();
}
</script>
</head>
<body>
<button onclick="start();">Start</button>
<button onclick="terminate();">Terminate</button>
<br />
<video id="remoteVideo" autoplay></video>
</body>
</html>
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/webapp/playerFilter.html
25
www.kurento.org
Adding Computer Vision: See the
example working
https://www.youtube.com/watch?v=yJAQs23eoXw
26
www.kurento.org
WebRTC loopback
Media Pipeline
WebRTC
Streaming
Media API
REST API (Open API protocol)
Handler codeI want
“this media (SDP)”
Media is
“at here (SDP)”
SinkSRC
27
www.kurento.org
WebRTC loopback: Handler code
28
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/java/com/kurento/tutorial/MyWebRtcLoopback.java
@WebRtcContentService(path = "/webRtcLoopback")
public class MyWebRtcLoopback extends WebRtcContentHandler {
@Override
public void onContentRequest(WebRtcContentSession contentSession) throws Exception {
MediaPipeline mp = contentSession.getMediaPipelineFactory().create();
contentSession.releaseOnTerminate(mp);
WebRtcEndpoint webRtcEndpoint = mp.newWebRtcEndpoint().build();
webRtcEndpoint.connect(webRtcEndpoint);
contentSession.start(webRtcEndpoint);
}
}
28
www.kurento.org
WebRTC loopback: client code
29
<!DOCTYPE html>
<html>
<head>
<script src="./js/kws-content-api.js"></script>
<script
src="https://webrtc.googlecode.com/svn/trunk/samples/js/base/adapter.js"></script>
<script>
var conn;
function start() {
var options = {
localVideoTag : "localVideo",
remoteVideoTag : "remoteVideo"
};
conn = new kwsContentApi.KwsWebRtcContent("./webRtcLoopback", options);
}
function terminate() {
conn.terminate();
}
</script>
</head>
<body>
<button id="start" onclick="start();">Start</button>
<button id="terminate" onclick="terminate();">Terminate</button>
<br />
<video id="localVideo" autoplay></video>
<video id="remoteVideo" autoplay></video>
</body>
</html>
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/webapp/webrtcLoopback.html
29
www.kurento.org
WebRTC loopback: see the example
working
30
https://www.youtube.com/watch?v=HaVqO06uuNA
30
www.kurento.org
WebRTC recording
Media Pipeline
WebRTC
Streaming
Media API
REST API (Open API protocol)
Handler codeI want
“this media (SDP)”
Media is
“at here (SDP)”
SinkSRC
Sink
Media
to
file or
URI
31
www.kurento.org
WebRTC recorder: Handler code
32
Source https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/java/com/kurento/tutorial/MyWebRtcRecorder.java
Source of handler playing the recorded video:
https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/java/com/kurento/tutorial/MyPlayerRecording.java
@WebRtcContentService(path = "/webRtcRecorder")
public class MyWebRtcRecorder extends WebRtcContentHandler {
@Override
public void onContentRequest(WebRtcContentSession contentSession) throws Exception {
MediaPipeline mp = contentSession.getMediaPipelineFactory().create();
contentSession.releaseOnTerminate(mp);
WebRtcEndpoint webRtcEndpoint = mp.newWebRtcEndpoint().build();
RecorderEndpoint recorderEndpoint = mp.newRecorderEndpoint("file:///tmp/recording").build();
contentSession.setAttribute("recorder", recorderEndpoint);
webRtcEndpoint.connect(webRtcEndpoint);
webRtcEndpoint.connect(recorderEndpoint);
contentSession.start(webRtcEndpoint);
}
@Override
public void onContentStarted(WebRtcContentSession contentSession) {
RecorderEndpoint recorderEndpoint = (RecorderEndpoint) contentSession.getAttribute("recorder");
recorderEndpoint.record();
}
}
32
www.kurento.org
WebRTC recording: client code
33
<!DOCTYPE html>
<html>
<head>
<script src="./js/kws-content-api.js"></script>
<script
src="https://webrtc.googlecode.com/svn/trunk/samples/js/base/adapter.js"></script>
<script>
var conn;
function start() {
var options = {
localVideoTag : "localVideo",
remoteVideoTag : "remoteVideo"
};
conn = new kwsContentApi.KwsWebRtcContent("./webRtcRecorder", options);
}
function terminate() {
conn.terminate();
}
</script>
</head>
<body>
<button id="start" onclick="start();">Start</button>
<button id="terminate" onclick="terminate();">Terminate</button>
<a href="./playerRecording">Play recorded content</a>
<br />
<video id="localVideo" autoplay></video>
<video id="remoteVideo" autoplay></video>
</body>
</html>
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/webapp/webrtcRecorder.html
33
www.kurento.org
WebRTC recording: see the example
working
34
https://www.youtube.com/watch?v=ogN81PGkMuE
34
www.kurento.org
WebRTC one-to-many (Handler
omitted for simplicity)
Media Pipeline
SinkSRC
SRCSinkSRCSinkSRCSink
35
www.kurento.org
WebRTC one-to-many: Handler code
36
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/java/com/kurento/tutorial/MyWebRtcOneToMany.java
@WebRtcContentService(path = "/webRtcOneToMany")
public class MyWebRtcOneToMany extends WebRtcContentHandler {
private WebRtcEndpoint firstWebRtcEndpoint;
private String sessionId;
@Override
public synchronized void onContentRequest(WebRtcContentSession contentSession) throws Exception {
if (firstWebRtcEndpoint == null) {
MediaPipeline mp = contentSession.getMediaPipelineFactory().create();
contentSession.releaseOnTerminate(mp);
firstWebRtcEndpoint = mp.newWebRtcEndpoint().build();
sessionId = contentSession.getSessionId();
contentSession.releaseOnTerminate(firstWebRtcEndpoint);
firstWebRtcEndpoint.connect(firstWebRtcEndpoint); //Loopback
contentSession.start(firstWebRtcEndpoint);
} else {
MediaPipeline mp = firstWebRtcEndpoint.getMediaPipeline();
WebRtcEndpoint newWebRtcEndpoint = mp.newWebRtcEndpoint().build();
contentSession.releaseOnTerminate(newWebRtcEndpoint);
newWebRtcEndpoint.connect(firstWebRtcEndpoint);
firstWebRtcEndpoint.connect(newWebRtcEndpoint); //Latest client gives media to the master endpoint
contentSession.start(newWebRtcEndpoint);
}
}
}
36
www.kurento.org
WebRTC one-to-many: client code
37
<!DOCTYPE html>
<html>
<head>
<script src="./js/kws-content-api.js"></script>
<script
src="https://webrtc.googlecode.com/svn/trunk/samples/js/base/adapter.js"></script>
<script>
var conn;
function start() {
var options = {
localVideoTag : "localVideo",
remoteVideoTag : "remoteVideo"
};
conn = new kwsContentApi.KwsWebRtcContent("./webRtcOneToMany", options);
}
function terminate() {
conn.terminate();
}
</script>
</head>
<body>
<button id="start" onclick="start();">Start</button>
<button id="terminate" onclick="terminate();">Terminate</button>
<br />
<video id="localVideo" autoplay></video>
<video id="remoteVideo" autoplay></video>
</body>
</html>
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/webapp/webrtcOneToMany.html
37
www.kurento.org
WebRTC one-to-many: see the
example working
38
https://www.youtube.com/watch?v=TBkrl3fmHWI
38
www.kurento.org
WebRTC game (Handler omitted for
simplicity)
Media Pipeline
SinkSRC
Sink
SRC
Sink
SRC
39
www.kurento.org
WebRTC game: Handler code
40
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/java/com/kurento/tutorial/MyWebRtcWithFilters.java
@WebRtcContentService(path = "/webRtcWithFilters")
public class MyWebRtcWithFilters extends WebRtcContentHandler {
@Override
public void onContentRequest(WebRtcContentSession contentSession)throws Exception {
final MediaPipeline mp = contentSession.getMediaPipelineFactory().create();
contentSession.releaseOnTerminate(mp);
final WebRtcEndpoint webRtcEndpoint = mp.newWebRtcEndpoint().build();
final PointerDetectorFilter pointerDetectorFilter = mp.newPointerDetectorFilter().build();
final FaceOverlayFilter faceOverlayFilter = mp.newFaceOverlayFilter().build();
PointerDetectorWindowMediaParam start = new PointerDetectorWindowMediaParam("start", 100, 100, 280, 380);
start.setImage("http://ci.kurento.com/imgs/start.png");
pointerDetectorFilter.addWindow(start);
pointerDetectorFilter.addWindowInListener(new MediaEventListener<WindowInEvent>() {
public void onEvent(WindowInEvent event) {
faceOverlayFilter.setOverlayedImage(
"http://ci.kurento.com/imgs/mario-wings.png",
-0.35F, -1.2F, 1.6F, 1.6F);
}
});
webRtcEndpoint.connect(pointerDetectorFilter);
pointerDetectorFilter.connect(faceOverlayFilter);
faceOverlayFilter.connect(webRtcEndpoint);
contentSession.start(webRtcEndpoint);
}
}
40
www.kurento.org
WebRTC game: client code
41
<!DOCTYPE html>
<html>
<head>
<script src="./js/kws-content-api.js"></script>
<script
src="https://webrtc.googlecode.com/svn/trunk/samples/js/base/adapter.js"></script>
<script>
var conn;
function start() {
var options = {
remoteVideoTag : "remoteVideo"
};
conn = new kwsContentApi.KwsWebRtcContent("./webRtcWithFilters", options);
}
function terminate() {
conn.terminate();
}
</script>
</head>
<body>
<button id="start" onclick="start();">Start</button>
<button id="terminate" onclick="terminate();">Terminate</button>
<br />
<video id="remoteVideo" autoplay></video>
</body>
</html>
Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf-
tutorial/src/main/webapp/webrtcFilters.html
41
www.kurento.org
WebRTC game: see the example
working
42
https://www.youtube.com/watch?v=5eJRnwKxgbY
42
www.kurento.org
Collaborations welcome
http://www.github.com/kurento
Thank you very much for your attention
Suggestions, comments and complains:
lulop@kurento.org
43

Más contenido relacionado

La actualidad más candente

FOSDEM 2016 - Creating rich WebRTC Applications with Kurento
FOSDEM 2016 - Creating rich WebRTC Applications with KurentoFOSDEM 2016 - Creating rich WebRTC Applications with Kurento
FOSDEM 2016 - Creating rich WebRTC Applications with KurentoLuis Lopez
 
elasticRTC -- how to have your own WebRTC cloud scaling to be billions in min...
elasticRTC -- how to have your own WebRTC cloud scaling to be billions in min...elasticRTC -- how to have your own WebRTC cloud scaling to be billions in min...
elasticRTC -- how to have your own WebRTC cloud scaling to be billions in min...Luis Lopez
 
Developing applications with Kurento
Developing applications with KurentoDeveloping applications with Kurento
Developing applications with KurentoLuis Lopez
 
kurento-nubomedia-first-steps-v1
kurento-nubomedia-first-steps-v1kurento-nubomedia-first-steps-v1
kurento-nubomedia-first-steps-v1Luis Lopez
 
WebRTC business models beyond calls
WebRTC business models beyond callsWebRTC business models beyond calls
WebRTC business models beyond callsLuis Lopez
 
Nubomedia IETF96 hackthon - Kurento
Nubomedia IETF96 hackthon - KurentoNubomedia IETF96 hackthon - Kurento
Nubomedia IETF96 hackthon - KurentoIvan Gracia
 
Advanced Kurento Real Time Media Stream Processing
Advanced Kurento Real Time Media Stream ProcessingAdvanced Kurento Real Time Media Stream Processing
Advanced Kurento Real Time Media Stream ProcessingFIWARE
 
NUBOMEDIA: an Elastic PaaS Enabling the Convergence of Real-Time and Big Data...
NUBOMEDIA: an Elastic PaaS Enabling the Convergence of Real-Time and Big Data...NUBOMEDIA: an Elastic PaaS Enabling the Convergence of Real-Time and Big Data...
NUBOMEDIA: an Elastic PaaS Enabling the Convergence of Real-Time and Big Data...Boni García
 
Nubomedia IETF96 hackathon - The platform
Nubomedia IETF96 hackathon - The platformNubomedia IETF96 hackathon - The platform
Nubomedia IETF96 hackathon - The platformIvan Gracia
 
WebRTC/Kurento/NUBOMEDIA Hackathon at IETF’96
WebRTC/Kurento/NUBOMEDIA Hackathon at IETF’96WebRTC/Kurento/NUBOMEDIA Hackathon at IETF’96
WebRTC/Kurento/NUBOMEDIA Hackathon at IETF’96Boni García
 
WebRTC on Mobile Devices: Challenges and Opportunities
WebRTC on Mobile Devices: Challenges and OpportunitiesWebRTC on Mobile Devices: Challenges and Opportunities
WebRTC on Mobile Devices: Challenges and OpportunitiesVladimir Beloborodov
 
WebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco StrategyWebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco StrategyJose de Castro
 
WebRTC overview
WebRTC overviewWebRTC overview
WebRTC overviewRouyun Pan
 
WebRTC: A front-end perspective
WebRTC: A front-end perspectiveWebRTC: A front-end perspective
WebRTC: A front-end perspectiveshwetank
 
State of Securing Restful APIs s12gx2015
State of Securing Restful APIs s12gx2015State of Securing Restful APIs s12gx2015
State of Securing Restful APIs s12gx2015robwinch
 
WebRTC Check-in (from WebRTC Boston 6)
WebRTC Check-in (from WebRTC Boston 6)WebRTC Check-in (from WebRTC Boston 6)
WebRTC Check-in (from WebRTC Boston 6)Chad Hart
 
Janus RTP forwarders @ FOSDEM 2020
Janus RTP forwarders @ FOSDEM 2020Janus RTP forwarders @ FOSDEM 2020
Janus RTP forwarders @ FOSDEM 2020Lorenzo Miniero
 

La actualidad más candente (20)

FOSDEM 2016 - Creating rich WebRTC Applications with Kurento
FOSDEM 2016 - Creating rich WebRTC Applications with KurentoFOSDEM 2016 - Creating rich WebRTC Applications with Kurento
FOSDEM 2016 - Creating rich WebRTC Applications with Kurento
 
elasticRTC -- how to have your own WebRTC cloud scaling to be billions in min...
elasticRTC -- how to have your own WebRTC cloud scaling to be billions in min...elasticRTC -- how to have your own WebRTC cloud scaling to be billions in min...
elasticRTC -- how to have your own WebRTC cloud scaling to be billions in min...
 
Developing applications with Kurento
Developing applications with KurentoDeveloping applications with Kurento
Developing applications with Kurento
 
kurento-nubomedia-first-steps-v1
kurento-nubomedia-first-steps-v1kurento-nubomedia-first-steps-v1
kurento-nubomedia-first-steps-v1
 
WebRTC business models beyond calls
WebRTC business models beyond callsWebRTC business models beyond calls
WebRTC business models beyond calls
 
Nubomedia IETF96 hackthon - Kurento
Nubomedia IETF96 hackthon - KurentoNubomedia IETF96 hackthon - Kurento
Nubomedia IETF96 hackthon - Kurento
 
Kurento FIWARE
Kurento FIWAREKurento FIWARE
Kurento FIWARE
 
Advanced Kurento Real Time Media Stream Processing
Advanced Kurento Real Time Media Stream ProcessingAdvanced Kurento Real Time Media Stream Processing
Advanced Kurento Real Time Media Stream Processing
 
NUBOMEDIA: an Elastic PaaS Enabling the Convergence of Real-Time and Big Data...
NUBOMEDIA: an Elastic PaaS Enabling the Convergence of Real-Time and Big Data...NUBOMEDIA: an Elastic PaaS Enabling the Convergence of Real-Time and Big Data...
NUBOMEDIA: an Elastic PaaS Enabling the Convergence of Real-Time and Big Data...
 
Nubomedia IETF96 hackathon - The platform
Nubomedia IETF96 hackathon - The platformNubomedia IETF96 hackathon - The platform
Nubomedia IETF96 hackathon - The platform
 
WebRTC/Kurento/NUBOMEDIA Hackathon at IETF’96
WebRTC/Kurento/NUBOMEDIA Hackathon at IETF’96WebRTC/Kurento/NUBOMEDIA Hackathon at IETF’96
WebRTC/Kurento/NUBOMEDIA Hackathon at IETF’96
 
WebRTC
WebRTCWebRTC
WebRTC
 
WebRTC on Mobile Devices: Challenges and Opportunities
WebRTC on Mobile Devices: Challenges and OpportunitiesWebRTC on Mobile Devices: Challenges and Opportunities
WebRTC on Mobile Devices: Challenges and Opportunities
 
WebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco StrategyWebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco Strategy
 
WebRTC overview
WebRTC overviewWebRTC overview
WebRTC overview
 
WebRTC: A front-end perspective
WebRTC: A front-end perspectiveWebRTC: A front-end perspective
WebRTC: A front-end perspective
 
State of Securing Restful APIs s12gx2015
State of Securing Restful APIs s12gx2015State of Securing Restful APIs s12gx2015
State of Securing Restful APIs s12gx2015
 
WebRTC Check-in (from WebRTC Boston 6)
WebRTC Check-in (from WebRTC Boston 6)WebRTC Check-in (from WebRTC Boston 6)
WebRTC Check-in (from WebRTC Boston 6)
 
Reactive Web Applications
Reactive Web ApplicationsReactive Web Applications
Reactive Web Applications
 
Janus RTP forwarders @ FOSDEM 2020
Janus RTP forwarders @ FOSDEM 2020Janus RTP forwarders @ FOSDEM 2020
Janus RTP forwarders @ FOSDEM 2020
 

Destacado

NUBOMEDIA: an elastic Platform as a Service (PaaS) cloud for interactive soci...
NUBOMEDIA: an elastic Platform as a Service (PaaS) cloud for interactive soci...NUBOMEDIA: an elastic Platform as a Service (PaaS) cloud for interactive soci...
NUBOMEDIA: an elastic Platform as a Service (PaaS) cloud for interactive soci...Luis Lopez
 
Improving GStreamer performance on large pipelines: from profiling to optimiz...
Improving GStreamer performance on large pipelines: from profiling to optimiz...Improving GStreamer performance on large pipelines: from profiling to optimiz...
Improving GStreamer performance on large pipelines: from profiling to optimiz...Luis Lopez
 
A New QoS Renegotiation Mechanism for Multimedia Applications
A New QoS Renegotiation Mechanism for Multimedia ApplicationsA New QoS Renegotiation Mechanism for Multimedia Applications
A New QoS Renegotiation Mechanism for Multimedia ApplicationsABDELAAL
 
Lecture 3 java basics
Lecture 3 java basicsLecture 3 java basics
Lecture 3 java basicsthe_wumberlog
 
Down to Stack Traces, up from Heap Dumps
Down to Stack Traces, up from Heap DumpsDown to Stack Traces, up from Heap Dumps
Down to Stack Traces, up from Heap DumpsAndrei Pangin
 
Building a Docker v1.12 Swarm cluster on ARM
Building a Docker v1.12 Swarm cluster on ARMBuilding a Docker v1.12 Swarm cluster on ARM
Building a Docker v1.12 Swarm cluster on ARMTeam Hypriot
 
Understanding the mysteries of the CSS property value syntax
Understanding the mysteries of the CSS property value syntaxUnderstanding the mysteries of the CSS property value syntax
Understanding the mysteries of the CSS property value syntaxRuss Weakley
 
Interpersonal Communications and Perceptions Chapter 3 Revised 9/14
Interpersonal Communications and Perceptions   Chapter 3 Revised 9/14Interpersonal Communications and Perceptions   Chapter 3 Revised 9/14
Interpersonal Communications and Perceptions Chapter 3 Revised 9/14Ray Brannon
 
Design Steps for any MultiMedia Applications
Design Steps for any MultiMedia ApplicationsDesign Steps for any MultiMedia Applications
Design Steps for any MultiMedia Applicationstechbirbal
 
The "Why", "What" and "How" of Microservices
The "Why", "What" and "How" of Microservices The "Why", "What" and "How" of Microservices
The "Why", "What" and "How" of Microservices INPAY
 
Interpersonal Communications Project 3
Interpersonal Communications Project 3Interpersonal Communications Project 3
Interpersonal Communications Project 3talktsutoastmasters
 
Introduction to multimedia
Introduction to multimedia Introduction to multimedia
Introduction to multimedia Selma Ibrahim
 
Interpersonal Communications Project 2
Interpersonal Communications Project 2Interpersonal Communications Project 2
Interpersonal Communications Project 2talktsutoastmasters
 
Interpersonal Communications Project 1
Interpersonal Communications Project 1Interpersonal Communications Project 1
Interpersonal Communications Project 1talktsutoastmasters
 

Destacado (15)

NUBOMEDIA: an elastic Platform as a Service (PaaS) cloud for interactive soci...
NUBOMEDIA: an elastic Platform as a Service (PaaS) cloud for interactive soci...NUBOMEDIA: an elastic Platform as a Service (PaaS) cloud for interactive soci...
NUBOMEDIA: an elastic Platform as a Service (PaaS) cloud for interactive soci...
 
Improving GStreamer performance on large pipelines: from profiling to optimiz...
Improving GStreamer performance on large pipelines: from profiling to optimiz...Improving GStreamer performance on large pipelines: from profiling to optimiz...
Improving GStreamer performance on large pipelines: from profiling to optimiz...
 
A New QoS Renegotiation Mechanism for Multimedia Applications
A New QoS Renegotiation Mechanism for Multimedia ApplicationsA New QoS Renegotiation Mechanism for Multimedia Applications
A New QoS Renegotiation Mechanism for Multimedia Applications
 
Lecture 3 java basics
Lecture 3 java basicsLecture 3 java basics
Lecture 3 java basics
 
Down to Stack Traces, up from Heap Dumps
Down to Stack Traces, up from Heap DumpsDown to Stack Traces, up from Heap Dumps
Down to Stack Traces, up from Heap Dumps
 
Building a Docker v1.12 Swarm cluster on ARM
Building a Docker v1.12 Swarm cluster on ARMBuilding a Docker v1.12 Swarm cluster on ARM
Building a Docker v1.12 Swarm cluster on ARM
 
Understanding the mysteries of the CSS property value syntax
Understanding the mysteries of the CSS property value syntaxUnderstanding the mysteries of the CSS property value syntax
Understanding the mysteries of the CSS property value syntax
 
Interpersonal Communications and Perceptions Chapter 3 Revised 9/14
Interpersonal Communications and Perceptions   Chapter 3 Revised 9/14Interpersonal Communications and Perceptions   Chapter 3 Revised 9/14
Interpersonal Communications and Perceptions Chapter 3 Revised 9/14
 
Design Steps for any MultiMedia Applications
Design Steps for any MultiMedia ApplicationsDesign Steps for any MultiMedia Applications
Design Steps for any MultiMedia Applications
 
The "Why", "What" and "How" of Microservices
The "Why", "What" and "How" of Microservices The "Why", "What" and "How" of Microservices
The "Why", "What" and "How" of Microservices
 
Interpersonal Communications Project 3
Interpersonal Communications Project 3Interpersonal Communications Project 3
Interpersonal Communications Project 3
 
JAVA Media Player
JAVA Media PlayerJAVA Media Player
JAVA Media Player
 
Introduction to multimedia
Introduction to multimedia Introduction to multimedia
Introduction to multimedia
 
Interpersonal Communications Project 2
Interpersonal Communications Project 2Interpersonal Communications Project 2
Interpersonal Communications Project 2
 
Interpersonal Communications Project 1
Interpersonal Communications Project 1Interpersonal Communications Project 1
Interpersonal Communications Project 1
 

Similar a Developing rich multimedia applications with Kurento: a tutorial for Java Developers

Kurento - FI-WARE Bootcamp
Kurento - FI-WARE BootcampKurento - FI-WARE Bootcamp
Kurento - FI-WARE BootcampIvan Gracia
 
ReproNow—Save Time Reproducing and Triaging Security Bugs
ReproNow—Save Time Reproducing and Triaging Security BugsReproNow—Save Time Reproducing and Triaging Security Bugs
ReproNow—Save Time Reproducing and Triaging Security BugsPriyanka Aash
 
Open Source and Accesssiblity - t12t meetup 181122
Open Source and Accesssiblity - t12t meetup 181122Open Source and Accesssiblity - t12t meetup 181122
Open Source and Accesssiblity - t12t meetup 181122Erik Zetterström
 
Internetandjava
InternetandjavaInternetandjava
Internetandjavamuniinb4u
 
JavaInternetlearning
JavaInternetlearningJavaInternetlearning
JavaInternetlearningmuniinb4u
 
Internetandjava
InternetandjavaInternetandjava
Internetandjavamuniinb4u
 
Javauserguide
JavauserguideJavauserguide
Javauserguidemuniinb4u
 
0150519-kurento.pdf
0150519-kurento.pdf0150519-kurento.pdf
0150519-kurento.pdfDejVoleti
 
Arcomem training Specifying Crawls Beginners
Arcomem training Specifying Crawls BeginnersArcomem training Specifying Crawls Beginners
Arcomem training Specifying Crawls Beginnersarcomem
 
Write a SocialTV app @ OpenSIPS 2021
Write a SocialTV app @ OpenSIPS 2021Write a SocialTV app @ OpenSIPS 2021
Write a SocialTV app @ OpenSIPS 2021Lorenzo Miniero
 
Arcomem training Specifying Crawls Advanced
Arcomem training Specifying Crawls AdvancedArcomem training Specifying Crawls Advanced
Arcomem training Specifying Crawls Advancedarcomem
 
Internet and Open Source Concepts in brief pdf
Internet and Open Source Concepts in brief pdfInternet and Open Source Concepts in brief pdf
Internet and Open Source Concepts in brief pdfneokushal17
 

Similar a Developing rich multimedia applications with Kurento: a tutorial for Java Developers (20)

Kurento cpmx
Kurento cpmxKurento cpmx
Kurento cpmx
 
Kurento - FI-WARE Bootcamp
Kurento - FI-WARE BootcampKurento - FI-WARE Bootcamp
Kurento - FI-WARE Bootcamp
 
ReproNow—Save Time Reproducing and Triaging Security Bugs
ReproNow—Save Time Reproducing and Triaging Security BugsReproNow—Save Time Reproducing and Triaging Security Bugs
ReproNow—Save Time Reproducing and Triaging Security Bugs
 
Open Source and Accesssiblity - t12t meetup 181122
Open Source and Accesssiblity - t12t meetup 181122Open Source and Accesssiblity - t12t meetup 181122
Open Source and Accesssiblity - t12t meetup 181122
 
Internetandjava
InternetandjavaInternetandjava
Internetandjava
 
ppttips
ppttipsppttips
ppttips
 
ppttips
ppttipsppttips
ppttips
 
Java
JavaJava
Java
 
ppttips
ppttipsppttips
ppttips
 
JavaInternetlearning
JavaInternetlearningJavaInternetlearning
JavaInternetlearning
 
ppt tips
ppt tipsppt tips
ppt tips
 
ppttips
ppttipsppttips
ppttips
 
Internetandjava
InternetandjavaInternetandjava
Internetandjava
 
Javauserguide
JavauserguideJavauserguide
Javauserguide
 
0150519-kurento.pdf
0150519-kurento.pdf0150519-kurento.pdf
0150519-kurento.pdf
 
Arcomem training Specifying Crawls Beginners
Arcomem training Specifying Crawls BeginnersArcomem training Specifying Crawls Beginners
Arcomem training Specifying Crawls Beginners
 
Write a SocialTV app @ OpenSIPS 2021
Write a SocialTV app @ OpenSIPS 2021Write a SocialTV app @ OpenSIPS 2021
Write a SocialTV app @ OpenSIPS 2021
 
Arcomem training Specifying Crawls Advanced
Arcomem training Specifying Crawls AdvancedArcomem training Specifying Crawls Advanced
Arcomem training Specifying Crawls Advanced
 
Cs2305 nol
Cs2305 nolCs2305 nol
Cs2305 nol
 
Internet and Open Source Concepts in brief pdf
Internet and Open Source Concepts in brief pdfInternet and Open Source Concepts in brief pdf
Internet and Open Source Concepts in brief pdf
 

Último

Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 

Último (20)

Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

Developing rich multimedia applications with Kurento: a tutorial for Java Developers

  • 1. www.kurento.org Real-time Multimedia Stream Processing Developing rich multimedia applications with KurentoDeveloping rich multimedia applications with Kurento: a tutorial for Java developers lulop@kurento.org http://www.kurento.org
  • 2. www.kurento.org Multimedia infrastructures for the Future Internet Media is here Media got there Media got there Analyze Transform Store Transport Enrich Augment Adapt Sensors Context Events Media is here 2
  • 3. www.kurento.org Enrich, augment, adapt, analyze, transform, store: what’s the problem? Complexity 3
  • 5. www.kurento.org •Interoperable media exchange (multiplatform/multiprotocol) •WebRTC, RTP, HTTP (video tag), etc. •Process media (Computer vision, augmented reality, media indexing, etc.) •Media and metadata recording and recovery •Transform and adapt media (H.264, H.263, VP8, Ogg, and others) •Media routing and mixing •Etc. Multimedia infrastructure • REST API • JavaScript API • Java API APIs • LGPL 2.1 Is distributed through a flexible FOSS license What’s Kurento 5
  • 6. www.kurento.org Kurento Media Server (KMS): the nucleus of Kurento • KMS is a middleware for media streams – Receives the stream – Process the stream – Issues the stream Send Receive Analyze Augment Enrich Transform Transcode Record Process Replicate Media Source Media Sink KMS 6
  • 7. www.kurento.org The Media API: The API for accessing KMS capabilities Send Receive Analyze Augment Enrich Transform Transcode Record Process Replicate Media Source Media Sink KMS Java Media API JavaScript Media API REST API Applications define the processing of streams getting through KMS 7
  • 8. www.kurento.org Media API: Media Elements and Media Pipelines SinkSRC Sink SRC SRCSink Sink Media Element • Provides a specific media functionality › Send/receive media › Process media › Transform media • Exchange media through › Sources › Sinks Media pipeline • Chain of media elements implementing the desired media logic. • The Media API provides the capability of creating media pipelines by joining media elements of the toolbox Media Element Sink SRC 8
  • 9. www.kurento.org Media API: trivial example (Java) MediaPipeline mp = contentSession.getMediaPipelineFactory().create(); PlayerEndpoint playerEndpoint = mp.newPlayerEndpoint(file:///myFile.webm).build(); HttpGetEndpoint httpEndpoint = mp.newHttpGetEndpoint().terminateOnEOS().build(); playerEndpoint.connect(httpEndpoint); httpEndpoint.getUrl(); //URL where the media is made available Media Pipeline (inside KMS) HttpGetEndpoint Media from file or URI HTTP media streaming Sink SRC PlayerEndpoint 9
  • 10. www.kurento.org Is that enough? Think about the WWW development model Process WWW request - DDBB access - Authentication - XML processing - Etc. HTTP request: I want this resource HTTP response: The resource • Intuition behind the WWW model – Client asks what it wants • GET /this_resource HTTP/1.1 – Server side APIs execute the associated processing You develop this using … • Servlet • JSP • ASP • PHP • Ruby on Rails • CGI • Etc. 10
  • 11. www.kurento.org We need an equivalent model: the role of the Signaling Plane • We need “something” with the capability of negotiating what, when and how media is exchanged • A protocol for “saying” – I want “this media” … • Identification of the media to exchange – File in hard-drive, IP camera, user, etc. – in “this way” … • Identification of the processing of media – Augmented, analyzed, etc. – with “this format” … • Quality – Codec, screen-size, frame-rate, etc. – at “this moment” • Stream control – Play, stop, start, pause, etc. 11
  • 12. www.kurento.org Don’t get it? think about WWW development again … Process WWW request - DDBB access - Authentication - XML processing - Etc. HTTP request: I want this resource HTTP response: The resource Process media request - Media API - DDBB access - Authentication - XML processing - Etc. Signaling request: I want this media Signaling response: The media is here This is how you create WWW applications (Servlets, ASP, PHP, Rails, etc.) This is how you create Kurento enabled applications: Multimedia RTC is just another feature of your application You, as a programmer, create this 12
  • 13. www.kurento.org Abstracting the signaling plane: The Content Handler KMS SinkSRC Sink SRC Sink SRCSink Media API REST API (Open API protocol) The Content Handler Equivalent to a Servlet/ASP/PHP script Exposes APIs for specifying: - when receiving “this request”… - … execute “this logic” Developer can use the media API Code building the media pipeline and executing the application logic the developer wants 13
  • 14. www.kurento.org Kurento Application Server: The container of Handlers • Is an extension of Java EE technologies. • Compatible with all Java EE Servlet containers • Hold Handlers – Your specific application code • Receives signaling requests: – I want “this media” in this way … • Dispatches request to the appropriate handler – @annotations based mapping • Generate an answer showing “where and how to find the media” – URL where media is located – Negotiated SDP Java EE compatible container HTTP Servlet SIP Servlet Web service s Kurento REST API Specific handler implementations Media API DD.BB. Kurento Application Server (KAS) Other java APIs. 14
  • 15. www.kurento.org Kurento Architecture: putting it all together Kurento Media Server (KMS) Receive Video Augmented Reality Send Video Computer Vision Video Playing and Recording Java EE compatible container HTTP Servlet SIP Servlet Web service s Kurento REST API Specific handler implementations Signaling and WWW traffic Media Media Signaling and WWW traffic Media API DD.BB. Kurento Application Server (KAS) Other java APIs. 15
  • 16. www.kurento.org Application execution flow Client Code Application Server (KAS) Media Server (KMS) I want this media in this way … (JSON-RPC request) Commands requesting the creation of a pipeline What you want is here … (JSON-RPC answer) Media negotiation phase Media exchange phase 1 2 Specific application logic at the server-side (Content Handler) Media pipeline creation Media exchange between client and server 16
  • 17. www.kurento.org Content Handler: trivial example //Specify the type of service provided by this handler: Player, Recorder, WebRTC, RTP, etc. @HttpPlayerService(path = "/player”) //Mapping of handler specified in path public class MyPlayerHandler extends HttpPlayerHandler { @Override public void onContentRequest(HttpPlayerSession contentSession) { //Thie client wants the media this handler provides //Create the pipeline for providing the media } @Override public void onContentStarted(HttpPlayerSession contentSession) { //Media started flowing, you can execute additional actions } @Override Public void onSessionTerminated(HttpPlayerSession contentSenssion){ //Media exchange termianted, you can collect your resources } 17
  • 18. www.kurento.org Let’s develop with Kurento • What you need – A Kurento instance • You can install your own Kurento instance • You can launch a Kurento instance at the FI-LAB (FI-WARE project) – http://lab.fi-ware.org • Getting help – Kurento web site • http://www.kurento.org – Kurento mailing list • https://groups.google.com/forum/#!forum/kurento – Twitter • @kurentoms 18
  • 19. www.kurento.org Kurento Hello World: Playing a file with an HTML5 client Media Pipeline HttpGetEndpoint Media from file or URI HTTP media streaming Sink SRC PlayerEndpoint Media API REST API (Open API protocol) Handler codeI want “this media” Media is “at this URL” 19
  • 20. www.kurento.org Playing a file with an HTML5 client: Handler code@HttpPlayerService(path = "/player”) public class MyPlayerHandler extends HttpPlayerHandler { @Override public void onContentRequest(HttpPlayerSession contentSession) throws Exception { MediaPipeline mp = contentSession.getMediaPipelineFactory().create(); contentSession.releaseOnTerminate(mp); PlayerEndpoint playerEndpoint = mp.newPlayerEndpoint( "http://media.w3.org/2010/05/sintel/trailer.webm").build(); contentSession.setAttribute("player", playerEndpoint); HttpGetEndpoint httpEndpoint = mp.newHttpGetEndpoint().terminateOnEOS().build(); playerEndpoint.connect(httpEndpoint); contentSession.start(httpEndpoint); } @Override public void onContentStarted(HttpPlayerSession contentSession) { PlayerEndpoint playerEndpoint = (PlayerEndpoint) contentSession.getAttribute("player"); playerEndpoint.play(); } } Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/java/com/kurento/tutorial/MyPlayerHandler.java 20
  • 21. www.kurento.org Playing a file with an HTML5 client: client code<!DOCTYPE html> <html> <head> <script src="./js/kws-content-api.js"></script> <script> var conn; function start() { var options = { remoteVideoTag : "remoteVideo" }; conn = new kwsContentApi.KwsContentPlayer("./player", options); } function terminate() { conn.terminate(); } </script> </head> <body> <button onclick="start();">Start</button> <button onclick="terminate();">Terminate</button> <br /> <video id="remoteVideo" autoplay></video> </body> </html> Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/webapp/player.html 21
  • 22. www.kurento.org Playing a file with an HTML5 client: See the example working https://www.youtube.com/watch?v=n5BQlhYgGSo 22
  • 23. www.kurento.org Media Pipeline Adding Computer Vision HttpGetEndpoint Media from file or URI HTTP media streaming Sink SRC PlayerEndpoint SRC Sink JackVaderFilter Media API REST API (Open API protocol) Handler codeI want “this media” Media is “at this URL” 23
  • 24. www.kurento.org Adding Computer Vision: Handler code @HttpPlayerService(path = "/playerWithFilter”) public class MyPlayerHandler extends HttpPlayerHandler { @Override public void onContentRequest(HttpPlayerSession contentSession) throws Exception { MediaPipeline mp = contentSession.getMediaPipelineFactory().create(); contentSession.releaseOnTerminate(mp); PlayerEndpoint playerEndpoint = mp.newPlayerEndpoint( "http://media.w3.org/2010/05/sintel/trailer.webm").build(); contentSession.setAttribute("player", playerEndpoint); JackVaderFilter filter = mp.newJackVaderFilter().build(); HttpGetEndpoint httpEndpoint = mp.newHttpGetEndpoint().terminateOnEOS().build(); filter.connect(httpEndpoint); playerEndpoint.connect(filter); contentSession.start(httpEndpoint); } @Override public void onContentStarted(HttpPlayerSession contentSession) { PlayerEndpoint playerEndpoint = (PlayerEndpoint) contentSession.getAttribute("player"); playerEndpoint.play(); } } Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/java/com/kurento/tutorial/MyPlayerWithFilter.java 24
  • 25. www.kurento.org Adding Computer Vision: Client code <!DOCTYPE html> <html> <head> <script src="./js/kws-content-api.js"></script> <script> var conn; function start() { var options = { remoteVideoTag : "remoteVideo" }; conn = new kwsContentApi.KwsContentPlayer("./playerWithFilter", options); } function terminate() { conn.terminate(); } </script> </head> <body> <button onclick="start();">Start</button> <button onclick="terminate();">Terminate</button> <br /> <video id="remoteVideo" autoplay></video> </body> </html> Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/webapp/playerFilter.html 25
  • 26. www.kurento.org Adding Computer Vision: See the example working https://www.youtube.com/watch?v=yJAQs23eoXw 26
  • 27. www.kurento.org WebRTC loopback Media Pipeline WebRTC Streaming Media API REST API (Open API protocol) Handler codeI want “this media (SDP)” Media is “at here (SDP)” SinkSRC 27
  • 28. www.kurento.org WebRTC loopback: Handler code 28 Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/java/com/kurento/tutorial/MyWebRtcLoopback.java @WebRtcContentService(path = "/webRtcLoopback") public class MyWebRtcLoopback extends WebRtcContentHandler { @Override public void onContentRequest(WebRtcContentSession contentSession) throws Exception { MediaPipeline mp = contentSession.getMediaPipelineFactory().create(); contentSession.releaseOnTerminate(mp); WebRtcEndpoint webRtcEndpoint = mp.newWebRtcEndpoint().build(); webRtcEndpoint.connect(webRtcEndpoint); contentSession.start(webRtcEndpoint); } } 28
  • 29. www.kurento.org WebRTC loopback: client code 29 <!DOCTYPE html> <html> <head> <script src="./js/kws-content-api.js"></script> <script src="https://webrtc.googlecode.com/svn/trunk/samples/js/base/adapter.js"></script> <script> var conn; function start() { var options = { localVideoTag : "localVideo", remoteVideoTag : "remoteVideo" }; conn = new kwsContentApi.KwsWebRtcContent("./webRtcLoopback", options); } function terminate() { conn.terminate(); } </script> </head> <body> <button id="start" onclick="start();">Start</button> <button id="terminate" onclick="terminate();">Terminate</button> <br /> <video id="localVideo" autoplay></video> <video id="remoteVideo" autoplay></video> </body> </html> Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/webapp/webrtcLoopback.html 29
  • 30. www.kurento.org WebRTC loopback: see the example working 30 https://www.youtube.com/watch?v=HaVqO06uuNA 30
  • 31. www.kurento.org WebRTC recording Media Pipeline WebRTC Streaming Media API REST API (Open API protocol) Handler codeI want “this media (SDP)” Media is “at here (SDP)” SinkSRC Sink Media to file or URI 31
  • 32. www.kurento.org WebRTC recorder: Handler code 32 Source https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/java/com/kurento/tutorial/MyWebRtcRecorder.java Source of handler playing the recorded video: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/java/com/kurento/tutorial/MyPlayerRecording.java @WebRtcContentService(path = "/webRtcRecorder") public class MyWebRtcRecorder extends WebRtcContentHandler { @Override public void onContentRequest(WebRtcContentSession contentSession) throws Exception { MediaPipeline mp = contentSession.getMediaPipelineFactory().create(); contentSession.releaseOnTerminate(mp); WebRtcEndpoint webRtcEndpoint = mp.newWebRtcEndpoint().build(); RecorderEndpoint recorderEndpoint = mp.newRecorderEndpoint("file:///tmp/recording").build(); contentSession.setAttribute("recorder", recorderEndpoint); webRtcEndpoint.connect(webRtcEndpoint); webRtcEndpoint.connect(recorderEndpoint); contentSession.start(webRtcEndpoint); } @Override public void onContentStarted(WebRtcContentSession contentSession) { RecorderEndpoint recorderEndpoint = (RecorderEndpoint) contentSession.getAttribute("recorder"); recorderEndpoint.record(); } } 32
  • 33. www.kurento.org WebRTC recording: client code 33 <!DOCTYPE html> <html> <head> <script src="./js/kws-content-api.js"></script> <script src="https://webrtc.googlecode.com/svn/trunk/samples/js/base/adapter.js"></script> <script> var conn; function start() { var options = { localVideoTag : "localVideo", remoteVideoTag : "remoteVideo" }; conn = new kwsContentApi.KwsWebRtcContent("./webRtcRecorder", options); } function terminate() { conn.terminate(); } </script> </head> <body> <button id="start" onclick="start();">Start</button> <button id="terminate" onclick="terminate();">Terminate</button> <a href="./playerRecording">Play recorded content</a> <br /> <video id="localVideo" autoplay></video> <video id="remoteVideo" autoplay></video> </body> </html> Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/webapp/webrtcRecorder.html 33
  • 34. www.kurento.org WebRTC recording: see the example working 34 https://www.youtube.com/watch?v=ogN81PGkMuE 34
  • 35. www.kurento.org WebRTC one-to-many (Handler omitted for simplicity) Media Pipeline SinkSRC SRCSinkSRCSinkSRCSink 35
  • 36. www.kurento.org WebRTC one-to-many: Handler code 36 Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/java/com/kurento/tutorial/MyWebRtcOneToMany.java @WebRtcContentService(path = "/webRtcOneToMany") public class MyWebRtcOneToMany extends WebRtcContentHandler { private WebRtcEndpoint firstWebRtcEndpoint; private String sessionId; @Override public synchronized void onContentRequest(WebRtcContentSession contentSession) throws Exception { if (firstWebRtcEndpoint == null) { MediaPipeline mp = contentSession.getMediaPipelineFactory().create(); contentSession.releaseOnTerminate(mp); firstWebRtcEndpoint = mp.newWebRtcEndpoint().build(); sessionId = contentSession.getSessionId(); contentSession.releaseOnTerminate(firstWebRtcEndpoint); firstWebRtcEndpoint.connect(firstWebRtcEndpoint); //Loopback contentSession.start(firstWebRtcEndpoint); } else { MediaPipeline mp = firstWebRtcEndpoint.getMediaPipeline(); WebRtcEndpoint newWebRtcEndpoint = mp.newWebRtcEndpoint().build(); contentSession.releaseOnTerminate(newWebRtcEndpoint); newWebRtcEndpoint.connect(firstWebRtcEndpoint); firstWebRtcEndpoint.connect(newWebRtcEndpoint); //Latest client gives media to the master endpoint contentSession.start(newWebRtcEndpoint); } } } 36
  • 37. www.kurento.org WebRTC one-to-many: client code 37 <!DOCTYPE html> <html> <head> <script src="./js/kws-content-api.js"></script> <script src="https://webrtc.googlecode.com/svn/trunk/samples/js/base/adapter.js"></script> <script> var conn; function start() { var options = { localVideoTag : "localVideo", remoteVideoTag : "remoteVideo" }; conn = new kwsContentApi.KwsWebRtcContent("./webRtcOneToMany", options); } function terminate() { conn.terminate(); } </script> </head> <body> <button id="start" onclick="start();">Start</button> <button id="terminate" onclick="terminate();">Terminate</button> <br /> <video id="localVideo" autoplay></video> <video id="remoteVideo" autoplay></video> </body> </html> Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/webapp/webrtcOneToMany.html 37
  • 38. www.kurento.org WebRTC one-to-many: see the example working 38 https://www.youtube.com/watch?v=TBkrl3fmHWI 38
  • 39. www.kurento.org WebRTC game (Handler omitted for simplicity) Media Pipeline SinkSRC Sink SRC Sink SRC 39
  • 40. www.kurento.org WebRTC game: Handler code 40 Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/java/com/kurento/tutorial/MyWebRtcWithFilters.java @WebRtcContentService(path = "/webRtcWithFilters") public class MyWebRtcWithFilters extends WebRtcContentHandler { @Override public void onContentRequest(WebRtcContentSession contentSession)throws Exception { final MediaPipeline mp = contentSession.getMediaPipelineFactory().create(); contentSession.releaseOnTerminate(mp); final WebRtcEndpoint webRtcEndpoint = mp.newWebRtcEndpoint().build(); final PointerDetectorFilter pointerDetectorFilter = mp.newPointerDetectorFilter().build(); final FaceOverlayFilter faceOverlayFilter = mp.newFaceOverlayFilter().build(); PointerDetectorWindowMediaParam start = new PointerDetectorWindowMediaParam("start", 100, 100, 280, 380); start.setImage("http://ci.kurento.com/imgs/start.png"); pointerDetectorFilter.addWindow(start); pointerDetectorFilter.addWindowInListener(new MediaEventListener<WindowInEvent>() { public void onEvent(WindowInEvent event) { faceOverlayFilter.setOverlayedImage( "http://ci.kurento.com/imgs/mario-wings.png", -0.35F, -1.2F, 1.6F, 1.6F); } }); webRtcEndpoint.connect(pointerDetectorFilter); pointerDetectorFilter.connect(faceOverlayFilter); faceOverlayFilter.connect(webRtcEndpoint); contentSession.start(webRtcEndpoint); } } 40
  • 41. www.kurento.org WebRTC game: client code 41 <!DOCTYPE html> <html> <head> <script src="./js/kws-content-api.js"></script> <script src="https://webrtc.googlecode.com/svn/trunk/samples/js/base/adapter.js"></script> <script> var conn; function start() { var options = { remoteVideoTag : "remoteVideo" }; conn = new kwsContentApi.KwsWebRtcContent("./webRtcWithFilters", options); } function terminate() { conn.terminate(); } </script> </head> <body> <button id="start" onclick="start();">Start</button> <button id="terminate" onclick="terminate();">Terminate</button> <br /> <video id="remoteVideo" autoplay></video> </body> </html> Source: https://github.com/Kurento/kurento-media-framework/blob/develop/kmf-samples/kmf- tutorial/src/main/webapp/webrtcFilters.html 41
  • 42. www.kurento.org WebRTC game: see the example working 42 https://www.youtube.com/watch?v=5eJRnwKxgbY 42
  • 43. www.kurento.org Collaborations welcome http://www.github.com/kurento Thank you very much for your attention Suggestions, comments and complains: lulop@kurento.org 43