Académique Documents
Professionnel Documents
Culture Documents
Bachelorarbeit
Juli 2013
Erstgutachter: Zweitgutachter:
Zusammenfassung
Das hier ist eine Zusammenfassung. . . .
Abk urzungsverzeichnis
Inhaltsverzeichnis
1 Einleitung 1.1 ViaVitale . . . . . . . . . . . . . . . . 1.1.1 Team . . . . . . . . . . . . . . 1.2 Konzept . . . . . . . . . . . . . . . . . 1.3 Zielsetzung . . . . . . . . . . . . . . . 1.3.1 Livestreaming . . . . . . . . . . 1.3.2 Video-on-Demand . . . . . . . 1.4 Kurzbeschreibung der Webanwendung 1.5 Verwendete Technologien . . . . . . . 1 1 1 1 2 3 3 3 3 5 5 6 6 8 10 11 11 11 11 12 12 13 13 15 15 17 21 27 28
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
2 Video-Komponente 2.1 Livestreaming . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Herausforderungen . . . . . . . . . . . . . . . . 2.1.2 Client-Server Architektur . . . . . . . . . . . . 2.1.3 C++ RTMP SERVER . . . . . . . . . . . . . . 2.1.4 Flash Media Live Encoder . . . . . . . . . . . . 2.1.5 Flowplayer . . . . . . . . . . . . . . . . . . . . 2.1.6 Zusammenfassung Livestreaming-Komponente 2.2 Video-on-Demand . . . . . . . . . . . . . . . . . . . . 2.2.1 Amazon Web Services . . . . . . . . . . . . . . 2.2.2 FFmpeg . . . . . . . . . . . . . . . . . . . . . . 2.2.3 Paperclip . . . . . . . . . . . . . . . . . . . . . 2.2.4 Bitraten . . . . . . . . . . . . . . . . . . . . . . 2.2.5 Zusammenfassung VoD-Komponente . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
3 Schlussteil 3.1 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Literaturverzeichnis 5 Abbildungsverzeichnis 2.1: users.lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 vplayback.lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30 32
vi
Kapitel 1
Einleitung
Hier kommt noch eine Einleitung hin. Diese schreibe ich jedoch erst wenn die Arbeit fertig ist!:!:!:!:!:!:! :)
1.1
ViaVitale
Firma mit Sitz auf Mallorca (www.pilatesaufmallorca.com). Gr undung 2002. Inhaber Heike und Thomas Niemeier Ausgebildete Trainer im Bereich (R ucken-)Pilates, Personaltraining und Kinderboxen.
1.1.1
Team
Heike und Thomas als Inhaber mit der Gesch aftsidee. Zust andig f ur Organisation und Planung. Webdesigner, J urgen Jaskowiak. Rene und Sascha Gerritsen (www.nerdbrothers.de) Entwicklung und Integration der einzelnen Komponenten + Ver oentlichung des Gesamtsystems. Junges Start-Up Entwicklerteam. Markus f ur Video und Tonproduktion. Henning Str uber als Student f ur seine Bachelorarbeit. Verantwortlich f ur die Entwicklung der Social Network Komponente. Patrick Schnetger f ur die Entwicklung der Video-Komponente. Sp ater noch Firmen f ur Marketing usw. . . .
1.2
Konzept
Die Firma ViaVitale hat bei diversen Treen ein komplexes Konzept zur Gr undung des ersten Onlien R uckenstudios vorgestellt. Das Kernprodukt soll eine Social-Media-Network Webanwendung sein, die eine besondere Nische in dem stark wachsenden Online Fitnessstudio-Segment ausf ullt.
Kapitel 1. Einleitung
Neben klassischen R ucken ubungen bekommt das Online-Angebot durch das Verfolgen der Yoga und Pilates Philosophie einen besonderen Schwerpunkt. Nicht nur das Training selbst sonder auch die Verbindung zwischen k orperlicher und geistiger An- und Entspannung steht dabei im Vordergrund. Die Webanwendung soll nicht nur kostenpichtige Inhalte sondern auch Kostenfreie Inhalte bieten. Eine SOS-Seite soll neuen Nutzern bei akuten Problemen schnelle Hilfe anbieten um schlimmeres zu vermeiden. Arzte, Trainer und Physiotherapeuten ver oentlichen in einem Blog regelm aig Artikel zum Thema R ucken und Fitness. Kurze Trainingsvideos und Beispieltrainingspl ane geben zudem einen Einblick was ein Abo-Konto f ur Vorteile bietet. Ein Abo soll monatlich EUR 12,95 kosten und zudem jederzeit k undbar sein. Wer sich f ur ein Abo entscheidet bekommt neben allen sozialen Funktionen (R uckenfreunde nden, Trainingspl ane, Erfolge, Freundschaften und Termine teilen) auch Zugang zu regelm aig ausgestrahlten Livesendungen und einer Vielzahl an aufgezeichneten Trainingsvideos. Ein Erfolgssystem soll die Kundenbindung erh ohen und zu einer l angeren Mitgliedschaft beitragen. Eine eigene Produktlinie soll u onnen ber den eigenen Online-Shop vertrieben werden. Dort k Nutzer auch Mobile-Apps oder Trainingswochenenden auf Mallorca direkt kaufen. Wer sich eine pers onlichere Betreuung beim Training w unscht kann hier zudem Stunden bei einem ausgebildeten Trainer buchen. Erg anzend zur Webanwendung soll eine App f ur IOS und Android Tablets und Smartphones entwickelt werden, welche es Nutzern erm oglicht auch Mobil auf alle Inhalte zugreifen zu k onnen. Um die Zielgruppe zu erweitern m ochte die Firma ViaVitale auch an Firmen herantreten und eine eigene Desktopanwendung anbieten. Diese soll in regelm aigen Abst anden zu kurzen Pausen motivieren in denen Ubungen zur Haltungsverbesserung oder Entspannung durchgef uhrt werden. Alle Anwendungen sollen neueste Technologien verwenden um ein zeitgem aes Produkt auf den Markt zu bringen.
1.3
Zielsetzung
Aus dem vorgestellten Konzept wurde die folgende Zielsetzung f ur die Video-Komponente herausgearbeitet. Die Video-Komponente besteht aus zwei Teilen. Zum Einen die Livestreaming-Komponente und zum Anderen die Video-on-Demand-Komponente. F ur die Entwicklung beider Komponenten gilt es die Kompatibilit at zu den zur Zeit g angigen Endger aten unter der Beachtung der Breitbandverf ugbarkeit zu gew ahrleisten.
1.3.1
Livestreaming
Das Ziel der Livestreaming-Komponente ist es eine Empfehlung f ur eine geeignete Client- und Serverarchitektur zu liefern. Dabei wird bei allen beteiligten Systemen (Streaming Client, Streaming Server und Webanwendung) geeignete Hardware vorgestellt und eine sinnvolle Konguration der Software vorgeschlagen. F ur die Entwicklung und Einbindung soll so weit wie m oglich auf Open-Source-Software zur uckgegrien werden. Erg anzend sollen Konzepte und eigene Beispiele zur Sicherheit des Streaming Servers vorgestellt werden. Dazu geh ort die Serverseitige Validierung des Streaming-Clients, ein Authentizierungsmechanismus des Clients zum Server und die Validierung der Anwendung auf dem der Stream letztendlich abgespielt wird.
1.3.2
Video-on-Demand
Aufgezeichnete Livesendungen beziehungsweise gestellte Trainingsvideos sollen unter der Verwendung aktueller Technologien an den Nutzer gebracht werden. Videos sollen kategorisierbar und in nutzerspezischen Wiedergabelisten verwendet werden k onnen. Eine Empfehlung zur Absicherung der Videoinhalte solle ebenfalls vorgestellt werden. Wie beim Livestreaming sollen Videos nur von der Webseite selbst oder den zugeh origen Apps abgespielt werden k onnen. mal sehen ob ich das wirklich schreibe
1.4
Entwicklung der Webanwendung. Aufgeteilt in zwei Bereiche die als Empfehlung f ur das Gesamtsystem dient. Schwerpunkt social network und video streaming (live und on demand)
1.5
Verwendete Technologien
Ruby on Rails thin websockets paperclip aws-sdk haml ... Ajax PushServer Technologie javascript
4 jQuery Bibliothek c++ RTMP Server AWS FMLE metroUI (Demoseite) als CSS/HTML5 Framework Flowplayer
Kapitel 1. Einleitung
Kapitel 2
Video-Komponente
Die Videokomponente umfasst zwei Bereiche. Zum Einen ein Livestreaming-Dienst und zum Anderen ein Video-on-Demand Angebot. Livestreaming verwendet open source technologien (c++ rtmp server, fmle, owplayer, ..) VoD verwendet bestehende AWS Infrastrukturen (Serverauslastung und Speicherplatz,. . . ) Datenbankdesign Manuelle Playlisten im Backend
2.1
Livestreaming
Die Livestreaming-Komponente verlangt anders als die sp ater vorgestellte Video-on-DemandKomponente die direkte Interaktion zwischen dem ViaViale-Team und der Hardware (Kamera und Computer). F ur die richtigen Kameraeinstellungen und Verkabelung ist XYZ vor Ort verantwortlich. Eine einfache Interaktion und Konguration des Livestreaming-Clients ist daher notwendig. Neben der Nutzerinteraktion spielt auch die Beachtung der unterschiedlichen Endger ate und Breitbandverf ugbarkeiten eine Rolle. Um die unterschiedlichen Breitbandverf ugbarkeiten abzudecken ist es notwendig den Video-Stream in unterschiedlichen Bitraten bereitzustellen. W ahrend station are PCs und Laptops mit aktuellen Browser keine Probleme mit dem RTMP-Protokoll haben muss f ur IOS und Android Ger ate ein alternatives Protokoll zum Einsatz kommen wenn man den Endnutzern keine zus atzliche Arbeit mit der Installation von Plugins o. a. machen m ochte Quelle. Nativ unterst utzen IOS Browser RTSP und Android Browser RTP ????. Entweder alllgemein verfasst. . . . Im folgenden wird eine Empfehlung aller beteiligten Computer Systeme gegeben. Diese Umfasst die Hard- und Software des Streaming-Clients und -Servers. Sowie m ogliche Kongurationen
Kapitel 2. Video-Komponente
und Einsch atzungen von Belastbarkeit und Qualit at des aufgesetzten Systems. Oder schon explizit die technologien erw ahnen? Die Streaming-Architektur besteht aus einem Streaming Client und einem oder mehrerer Streaming Server. Mit dem Streaming Client ist eine hochau osende Kamera verbunden. F ur die Ubertragung des Video- und Audiosignals kommt der Adobe Flash Media Live Encoder (FMLE) zum Einsatz. Servereitig sorgt ein Open Source C++ RTMP-Server f ur die Bereitstellung des Streams via RTMP/RTSP. In der Webanwendung l auft der Flowplayer, welcher den RTMP Stream abruft. Im folgenden werden alle notwendigen Schritte zur Konguration von Hard- und Software mit Erl auterungen aufgef uhrt.
2.1.1
Herausforderungen
Streaming-Client muss ausreichend Upload-Kapazit aten f ur den Multi-Bitrate-Stream haben. Ausgehend von ca 2500 mbps Upstream sollten lt. Livestreaming.org mind. 5 mbps Upstream zur Verf ugung stehen. Verf ugbarkeit Sicherheit Qualit at entsprechend der unterschiedlichen Anbindung d. Endger ate Au osung d. Videos Videoformate
2.1.2
Client-Server Architektur
Die einfache Variante (Single-Server-Modell ) der Livestreaming Architektur (Abb 2.1) besteht aus Akteuren welche z.B. ein Gruppentraining mit einer HD Kamera lmen. Das Videosignal von der Kamera wird direkt vom Streaming-Client mit laufendem Flash Media Live Encoder ausgelesen, in unterschiedliche Bitraten konvertiert und nach erfolgreicher Anmeldung an den CRTMP-Server gesendet. Dieser kann je nach Konguration die eintreenden Videostreams als RMTP- oder RTSP-Stream auf vordenierten Ports zur Verf ugung stellen. Von dem auf der Webanwendung laufenden Flashplayer wird der Videostream dann bei Bedarf auf ClientPCs/Tablets/Smartphones abgespielt.
2.1. Livestreaming
Die Architektur zeigt schon, dass der Server die zentrale Komponente ist und der Groteil von Einschr ankungen von diesem ausgehen. Je nachdem wie viele Nutzer sich mit dem Server verbinden um den Stream zu sehen werden Hardwareressourcen und vor allem Netzwerkressourcen eingefordert. W ahrend sich die Hardwareressourcen auf das verarbeiten von maximal drei Videostreams beschr ankt, enth ullt eine einfache Rechnung, dass bei gew ohnliche UploadKapazit aten schnell gesprengt werden. Annahme: durchschnittliche Bitrate 1500 kbps bei 500 Clients = 750 Mpbs 500 Clients ist auch ca. die Anzahl an Nutzern, bei der die Hardware bis zu 60% ausgelastet ist. Optimal Auslastung um auch spikes abzufangen. Was tun bei mehr Nutzern? Das Aufsetzen eines Clusters (Abb. 2.2) kann das skalierungs (??) Problem l osen. Der Master-Server wird wie im Single Server Model aufgesetzt mit dem Unterschied, dass der Server nur Verbindungen von Mirror-Servern zul asst. Jeder Mirror-Server hat dann auch wieder f ur bis zu 500 Nutzer Kapazit aten. Die korrekte Funktionsweise (??) erfordert eine Plugin zum Load Balancing. M ochte ein Nutzer den Livestream ansehen wird zun achst die Latenz zu den jeweiligen Mirror-Servern u uft und die Last auf den Servern verglichen. Dem berpr Nutzer wird anschlieend ein Server zugewiesen. Ist ein Server voll weicht ein Nutzer auf Server mit h oherer Latenz aus.
Kapitel 2. Video-Komponente
2.1.3
Auf jedem Server l auft ein C++ RTMP Server (CRTMP-Server). Dabei handelt es sich um einen in C++ geschriebenen Streaming-Server welcher es Videos aufzunehmen bzw. zu senden. CRTMP-Server unterst utzt diverse Technologien. Der Server ist in der Lage Flash zu Empfangen und zu Senden (RTMP,RTMPE, RTMPS, RTMPT, RTMPTE), Signale von eingebetteten Ger aten (Android, IP-Kameras, Hardware-Encoders) zu Empfangen und zu Senden, Videos von IOS-Ger aten zu Empfangen und via MPEG-TS, RTSP/RTCP und RTP zu streamen. Die Verwendung dieser Technologien wird eine Kompatibilit at zu allen g angigen Endger ate ohne zus atzliche Plugins erreicht. W ahrend herk ommliche nicht IOS-Ger ate
L osung: HLS Plugin selber schreiben oder kommerzielel Version Evostream verwenden. In den Ausblick Konguration CRTMP-Server wird mit LUA-Skripten konguriert (s. Anhang 2.1 und 2.2). Die Hauptkongurationsdatei stellt in diesem Fall die vplayback.lua Datei dar. Entscheidend ist neben dem Einstellen von Log-Dateien die Konguration der Ports auf welchen der Server mit bestimmten Protokollen kommuniziert. Die Firma ViaVitale wird auf dem Client-System den FMLE verwenden. Dieser kommuniziert mit dem RTMP Protokoll. Nachdem eine Anwendung mit einem Namen und einer Beschreibung sowie weiterer optionaler Parameter festgelegt wird folgt die Denition der Akzeptoren (acceptors ). In der vplayback.lua wird Port 1395 f ur das RTMP Protokoll freigegeben. Der sogenannte acceptor. Weitere acceptors sind m oglich (z.B. f ur inboundv, inboundRTSP, inboundRTP, . . . ) --[[./config/flvplayback.lua]]-38 39 40 41 42 43 44 45
acceptors = { { ip =0.0.0.0 , p o r t =1935 , p r o t o c o l =inboundRtmp }, }, Anschlieend kann der Server noch einen Authentizierungsmechanismus aktivieren. Daf ur wird validateHandshake auf true gesetzt. Gefolgt von einem Authentizierungsblock --[[./config/flvplayback.lua]]--
46 47 48 49 50 51 52 53 54 55
v a l i d a t e H a n d s h a k e=t r u e , a u t h e n t i c a t i o n= { rtmp={ type=adobe , e n c o d e r A g e n t s= { FMLE/ 3 . 0 ( c o m p a t i b l e ; FMSc / 1 . 0 ) , }, u s e r s F i l e = u s e r s . l u a Die in Zeile 55 angegebene users.lua Datei enth alt die Nutzernamen/Passwort-Kombinationen. In diesem Fall haben nur die beiden Inhaber Thomas und Heike einen eigenen Zugang.
10 --[[./config/users.lua]]-1 2 3 4 5 6
Kapitel 2. Video-Komponente
Sicherheit Der Server wird auf unterschiedlichen Ebenen abgesichert: Nur Verbindung eines Encoders zum Server wenn Nutzername/passwort bekannt Server validiert IP-Adresse vom Encoding-Client, von weiteren Mirror-Servern und den DN sowie die IP-Adresse der Webandwendung. Dadurch wird verhindert, dass der Stream von anderen Anwendungen verwendet werden kann. Authentizierung wie zuvor beschrieben sch utzt davor, dass andere sich andere Encoder mit dem Server verbinden um diesen zum Streamen zu verwenden. Validierung von IP-Adressen und Domain-Names ndet beim Verbinden statt. Diese Funktion ist in der Open-Source-Variante des CRTMP-Servers nicht implementiert. Um diese Funktionalit at zu erreichen m ussen Header und C++ Dateien im rtmpprtocolhandler u ange berarbeitet (Anh 2.3/2.4) und neu kompiliert werden [1]. Hardware VM308 der Uni Osnabr uck Laut evo stream bis zu 12000 Clients/Instanz !!Upstream!! Stresstest
2.1.4
Adobe Tool Einstellungsm oglichkeiten Erl auterung der Ober ache konkretes Anwendungsbeispiel Verwendung in Kombination m. CRTMP
2.2. Video-on-Demand Hardware Anbindung ans Breitbandnetz Rechenbeispiel Resultierende Hardwareanforderungen Erl auterung
11
2.1.5
Flowplayer
Was ist das Verwendung im Frontend M oglichkeiten zur Konguration kostenpichtige Version Anpassung ans CD m oglich .... HTML5-Player mit Flash-Fallback Anwendungsbeispiel
2.1.6
Zusammenfassung Livestreaming-Komponente
2.2
Video-on-Demand
Verwendung von bestehender L osung wie Amazon Web Services. Skalierbarkeit und Speicherplatz. Anforderungen Herausforderungen
2.2.1
Pay what you need gute api f ur entwickler exibel auch andere Produkte wie die ec2 instanzen erl autern
12 Edge node verteilung Verkn. mit S3 signed urls validierung m oglich Konguration d. Komponente Codebeispiel
Kapitel 2. Video-Komponente
Erkl arungen
Amazon S3 Erl auterung Nur Datenspeicher Bereitgestellt f. CloudFront Public/Private Buckets Rails Integration via Paperclip
2.2.2
FFmpeg
Was ist das Transkodierungsbeispiel f. die g angigen Formate source mp4 target mp4, oggtheora und webm jpeg thumbnail aus dem sourcevideo codebeispiel
2.2.3
Paperclip
RoR gem Verwalten von Dateiuplaod f. Avatare oder Videos migrations anderung zeigen model anderung zeigen erl auterung preprocessing m oglich warum wollen wir das?
Pre-Processing Beispiel f ur den mpeg Preprocessor und die Style attribute Thumbnails
2.2. Video-on-Demand *
13
2.2.4
Bitraten
Tabelle mit den generierten Bitraten anhand der Einsellungen im Preprocessor Gegen uberstellung
2.2.5
Zusammenfassung VoD-Komponente
Technologien aufz ahlen hardware nicht mehr entscheidend => Alle g angigen Endger ate k onnen d. Streams Abrufen
Kapitel 3
Schlussteil
3.1 Fazit und Ausblick
15
Kapitel 4
Literaturverzeichnis
17
Literaturverzeichnis
[1] Rani: Protecting your streams from webpage. protect_streams. Version: Oktober 2012 http://wiki.rtmpd.com/tutorial_
19
Kapitel 5
Abbildungsverzeichnis
21
Abbildungsverzeichnis
2.1 2.2 Livestreaming Architektur - Einzelner Server . . . . . . . . . . . . . . . . . . . . Livestreaming Architektur - Server Cluster . . . . . . . . . . . . . . . . . . . . . 7 8
23
Erkl arung
Hiermit versichere ich, dass ich die vorliegende Arbeit selbst andig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt sowie Zitate kenntlich gemacht habe.
Anhang
2.1: users.lua
1 2 3 4 5 6
27
28
Abbildungsverzeichnis
2.2 vplayback.lua
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
[[./ c o n f i g / f l v p l a b a c k . l u a ]] c o n f i g u r a t i o n= { daemon=f a l s e , p a t h S e p a r a t o r =/ , logAppenders= { { name= c o n s o l e appender , type= c o l o r e d C o n s o l e , l e v e l =6 }, { name= f i l e appender , type= f i l e , l e v e l =6, f i l e N a m e =./ l o g s / c r t m p s e r v e r , f i l e H i s t o r y S i z e =10 , f i l e L e n g t h =1024 1024 , s i n g l e L i n e=t r u e } }, a p p l i c a t i o n s= { r o o t D i r e c t o r y = a p p l i c a t i o n s , { d e s c r i p t i o n =FLV Playback , name= f l v p l a y b a c k , p r o t o c o l = d y n a m i c l i n k l i b r a r y , d e f a u l t=t r u e , a l i a s e s= { live }, acceptors = { { ip =0.0.0.0 , p o r t =1935 ,
29
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
30
Abbildungsverzeichnis
2.3 rtmpappprotocolhandler.h
1 2 3 4 5 6
/ /
Copyright ( c ) 2 0 1 0 , G a v r i l o a i e EugenAndrei ( s h i r e t u @ g m a i l . com ) This f i l e i s p a r t o f c r t m p s e r v e r . c r t m p s e r v e r i s f r e e s o f t w a r e : you can r e d i s t r i b u t e i t and/ o r modify i t under t h e terms o f t h e GNU G e n e r a l P u b l i c L i c e n s e a s p u b l i s h e d by t h e Free S o f t w a r e Foundation , e i t h e r v e r s i o n 3 o f t h e L i c e n s e , o r ( a t your o p t i o n ) any l a t e r v e r s i o n . c r t m p s e r v e r i s d i s t r i b u t e d i n t h e hope t h a t i t w i l l be u s e f u l , but WITHOUT ANY WARRANTY; w i t h o u t even t h e i m p l i e d warranty o f MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE. See t h e GNU G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s . You s h o u l d have r e c e i v e d a copy o f t h e GNU G e n e r a l P u b l i c L i c e n s e a l o n g with c r t m p s e r v e r . I f not , s e e < h t t p : / /www. gnu . o r g / l i c e n s e s / >.
8 9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#i f d e f HAS PROTOCOL RTMP #i f n d e f RTMPAPPPROTOCOLHANDLER H #d e f i n e RTMPAPPPROTOCOLHANDLER H #i n c l u d e p r o t o c o l s /rtmp/ b a s e r t m p a p p p r o t o c o l h a n d l e r . h namespace a p p f l v p l a y b a c k { c l a s s RTMPAppProtocolHandler : p u b l i c BaseRTMPAppProtocolHandler { public : RTMPAppProtocolHandler ( V a r i a n t &c o n f i g u r a t i o n ) ; v i r t u a l RTMPAppProtocolHandler ( ) ; v i r t u a l b o o l P r o c e s s I n v o k e G e n e r i c ( BaseRTMPProtocol pFrom , V a r i a n t &r e q u e s t ) ; / ANFANG NEUER FUNKTIONEN /
36 37 38
Abbildungsverzeichnis
31
39 40
41 42 43 44 45 46
v i r t u a l b o o l P r o c e s s I n v o k e C o n n e c t ( BaseRTMPProtocol pFrom , V a r i a n t &r e q u e s t ) ; v i r t u a l b o o l V a l i d a t e R e q u e s t ( V a r i a n t &r e q u e s t ) ; / ENDE NEUE FUNKTIONEN / private : b o o l P r o c e s s G e t A v a i l a b l e F l v s ( BaseRTMPProtocol pFrom , V a r i a n t &r e q u e s t ) ; b o o l P r o c e s s I n s e r t M e t a d a t a ( BaseRTMPProtocol pFrom , V a r i a n t &r e q u e s t ) ; }; } #e n d i f / RTMPAPPPROTOCOLHANDLER H / #e n d i f / HAS PROTOCOL RTMP /
47
48 49 50 51
32
Abbildungsverzeichnis
2.4 rtmpappprotocolhandler.cpp
1 2 3 4 5 6
/ /
Copyright ( c ) 2 0 1 0 , G a v r i l o a i e EugenAndrei ( s h i r e t u @ g m a i l . com ) This f i l e i s p a r t o f c r t m p s e r v e r . c r t m p s e r v e r i s f r e e s o f t w a r e : you can r e d i s t r i b u t e i t and/ o r modify i t under t h e terms o f t h e GNU G e n e r a l P u b l i c L i c e n s e a s p u b l i s h e d by t h e Free S o f t w a r e Foundation , e i t h e r v e r s i o n 3 o f t h e L i c e n s e , o r ( a t your o p t i o n ) any l a t e r v e r s i o n . c r t m p s e r v e r i s d i s t r i b u t e d i n t h e hope t h a t i t w i l l be u s e f u l , but WITHOUT ANY WARRANTY; w i t h o u t even t h e i m p l i e d warranty o f MERCHANTABILITY o r FITNESS FOR A PARTICULAR PURPOSE. See t h e GNU G e n e r a l P u b l i c L i c e n s e f o r more d e t a i l s . You s h o u l d have r e c e i v e d a copy o f t h e GNU G e n e r a l P u b l i c L i c e n s e a l o n g with c r t m p s e r v e r . I f not , s e e < h t t p : / /www. gnu . o r g / l i c e n s e s / >.
8 9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24 25 26 27 28 29 30
#i f d e f HAS PROTOCOL RTMP #i n c l u d e r t m p a p p p r o t o c o l h a n d l e r . h #i n c l u d e p r o t o c o l s /rtmp/ b a s e r t m p p r o t o c o l . h #i n c l u d e p r o t o c o l s /rtmp/ m e s s a g e f a c t o r i e s / m e s s a g e f a c t o r i e s . h #i n c l u d e a p p l i c a t i o n / b a s e c l i e n t a p p l i c a t i o n . h #i n c l u d e s t r e a m i n g / b a s e i n n e t s t r e a m . h #i n c l u d e s t r e a m i n g / s t r e a m s t y p e s . h u s i n g namespace a p p f l v p l a y b a c k ; RTMPAppProtocolHandler : : RTMPAppProtocolHandler ( V a r i a n t &c o n f i g u r a t i o n ) : BaseRTMPAppProtocolHandler ( c o n f i g u r a t i o n ) { } RTMPAppProtocolHandler : : RTMPAppProtocolHandler ( ) { }
31 32 33 34 35 36 37
Abbildungsverzeichnis
33
38
39 40 41 42 43 44 45 46 47
b o o l RTMPAppProtocolHandler : : P r o c e s s I n v o k e G e n e r i c ( BaseRTMPProtocol pFrom , V a r i a n t &r e q u e s t ) { s t r i n g functionName = M INVOKE FUNCTION( r e q u e s t ) ; i f ( functionName == g e t A v a i l a b l e F l v s ) { r e t u r n P r o c e s s G e t A v a i l a b l e F l v s ( pFrom , r e q u e s t ) ; } e l s e i f ( functionName == i n s e r t M e t a d a t a ) { r e t u r n P r o c e s s I n s e r t M e t a d a t a ( pFrom , r e q u e s t ) ; } else { r e t u r n BaseRTMPAppProtocolHandler : : P r o c e s s I n v o k e G e n e r i c ( pFrom , r e q u e s t ) ; } } // adding f u n c t i o n s f o r f i l t e r v a l i d a t i o n s b o o l RTMPAppProtocolHandler : : P r o c e s s I n v o k e C o n n e c t ( BaseRTMPProtocol pFrom , V a r i a n t &r e q u e s t ) { / / 1 . Get t h e r e q u e s t params i f (M INVOKE PARAMS( r e q u e s t ) . MapSize ( ) < 1 ) { FATAL( I n v a l i d r e q u e s t ) ; return f a l s e ; } V a r i a n t c o n n e c t P a r a m e t e r s = M INVOKE PARAM( r e q u e s t , 0 ) ; i f ( authMethod != ) { //we have adobe auth e n a b l e d s t r i n g flashVer = connectParameters [ RM INVOKE PARAMS CONNECT FLASHVER ] ; i f ( ! c o n f i g u r a t i o n [ CONF APPLICATION AUTH ] [ CONF APPLICATION AUTH ENCODER AGENTS ] . HasKey ( flashVer ) ) { // t h i s c o n n e c t i o n w i l l not be a u t h e n t i c a t e d , s o we w i l l t r y t o v a l i d a t e t h e URI s i f ( ! ValidateRequest ( request ) ) { FATAL( I n v a l i d c o n n e c t r e q u e s t ) ; return f a l s e ; } } } else { //we don t have adobe auth e n a b l e d a t a l l . We w i l l t r y t o v a l i d a t e t h e URI s i f ( ! ValidateRequest ( request ) ) { FATAL( I n v a l i d c o n n e c t r e q u e s t ) ;
48 49 50 51 52
53 54 55 56 57 58 59 60 61 62
63
64
65 66 67 68 69 70 71
72 73
34 return f a l s e ; } }
Abbildungsverzeichnis
74 75 76 77 78 79
r e t u r n BaseRTMPAppProtocolHandler : : P r o c e s s I n v o k e C o n n e c t ( pFrom , request ) ; } b o o l RTMPAppProtocolHandler : : V a l i d a t e R e q u e s t ( V a r i a n t &r e q u e s t ) { //TODO: V a l i d a t e t h e v a r i o u s URI s i n s i d e t h e r e q u e s t h e r e / / 0 . Dump t h e r e q u e s t on c o n s o l e , j u s t t o s e e i t s s t r u c t u r e FINEST( I n i t i a l r e q u e s t : \ n%s , STR( r e q u e s t . T o S t r i n g ( ) ) ) ; / / 1 . Get t h e c o n n e c t params from t h e c o n n e c t i n v o k e V a r i a n t connectParams = M INVOKE PARAM( r e q u e s t , 0 ) ; / / 2 . This s h o u l d be a key v a l u e map i f ( connectParams != V MAP) { FATAL( I n c o r r e c t i n v o k e params : \ n%s , STR( r e q u e s t . ToString ( ) ) ) ; return f a l s e ; } / / 3 . Let s e x t r a c t few v a l u e s . Make s u r e we e x t r a c t them u s i n g nonc a s e s e n s i t i v e k e y s V a r i a n t t c U r l = connectParams . GetValue ( RM INVOKE PARAMS CONNECT TCURL, f a l s e ) ; // I f you a r e s u r e about c a s e s e n s i t i v e s e t t i n g s , you can extract it directly like this V a r i a n t s w f U r l = connectParams [ RM INVOKE PARAMS CONNECT SWFURL ] ; // V a r i a n t t c U r l = connectParams [ RM INVOKE PARAMS CONNECT TCURL ] ; V a r i a n t pageUrl = connectParams [ RM INVOKE PARAMS CONNECT PAGEURL ] ;
80 81 82 83 84 85 86 87 88 89 90 91 92
93 94 95 96
97
98 99
100
101
102
/ / 4 . Do some v a l i d a t i o n on them . i f ( pageUrl != V STRING) { FATAL( I n c o r r e c t RM INVOKE PARAMS CONNECT PAGEURL : % s , STR( r e q u e s t . T o S t r i n g ( ) ) ) ;
Abbildungsverzeichnis return f a l s e ; }
35
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
i f ( t c U r l != V STRING) { FATAL( I n c o r r e c t RM INVOKE PARAMS CONNECT TCURL : \ n% s , STR( r e q u e s t . T o S t r i n g ( ) ) ) ; return f a l s e ; } s t r i n g rawURI ; URI u r i ; i f ( ! URI : : FromString ( pageUrl , t r u e , u r i ) ) { FATAL( Unable t o p a r s e t h e u r i %s , STR( rawURI ) ) ; return f a l s e ; } // a s p r o t o we a r e g o i n g t o v a l i d a t e rtmp/ rtmpe // added i f / e l s e i f / e l s e and INFO l i k e Andriy s u g g e s t e d i f ( ( ( s t r i n g ) t c U r l ) != rtmp : / / r z 3 0 8 . uos . de / l i v e s t r e a m ) { INFO( Connect schema i s \ % s \ , STR( ( s t r i n g ) t c U r l ) ) ; } e l s e i f ( ( ( s t r i n g ) t c U r l ) != rtmpe : / / r z 3 0 8 . uos . de / livestream ) { INFO( Connect schema i s \ % s \ , STR( ( s t r i n g ) t c U r l ) ) ; } else { FATAL( I n c o r r e c t RM INVOKE PARAMS CONNECT TCURL : %s , STR( r e q u e s t . T o S t r i n g ( ) ) ) ; return f a l s e ; } // we u s e our s t a t i c f l o w p l a y e r which i s always on t h e same address // added i f / e l s e i f / e l s e and INFO l i k e Andriy s u g g e s t e d i f ( ( ( s t r i n g ) s w f U r l ) != h t t p : / /www. backzoom . de / f l o w p l a y e r / f l o w p l a y e r 3 . 2 . 5 . swf ) { INFO( F l a s h p l a y e r a d d r e s s i s \ % s \ , STR( ( s t r i n g ) swfUrl ) ) ; } e l s e i f ( ( ( s t r i n g ) s w f U r l ) != h t t p : / /www. backzoom . de / l i v e s t r e a m / p l a y e r . swf ) { INFO( F l a s h p l a y e r a d d r e s s i s \ % s \ , STR( ( s t r i n g ) swfUrl ) ) ; } else { FATAL( I n c o r r e c t RM INVOKE PARAMS CONNECT SWFURL : %s , STR( r e q u e s t . T o S t r i n g ( ) ) ) ;
136 137
138
139
140
36 return f a l s e ; }
Abbildungsverzeichnis
151
// i p which r e s o l v e our c a l l i n g webpage ( s ) / w e b s i t e ( s ) // added i f / e l s e i f / e l s e and INFO l i k e Andriy s u g g e s t e d i f ( ( ( s t r i n g ) u r i . i p ) == 8 3 . 1 3 3 . 9 7 . 2 2 2 ) { INFO( Stream c a l l i n g webpage i s \ % s \ , STR( ( s t r i n g ) pageUrl ) ) ; INFO( stream C a l l i n g webpage IP i s \ % s \ , STR( ( string ) uri . ip ) ) ; } else { FATAL( I n c o r r e c t RM INVOKE PARAMS CONNECT PAGEURL : %s , STR( r e q u e s t . T o S t r i n g ( ) ) ) ; return f a l s e ; } return true ; } b o o l RTMPAppProtocolHandler : : P r o c e s s G e t A v a i l a b l e F l v s ( BaseRTMPProtocol pFrom , V a r i a n t &r e q u e s t ) { Variant parameters ; p a r a m e t e r s . PushToArray ( V a r i a n t ( ) ) ; p a r a m e t e r s . PushToArray ( V a r i a n t ( ) ) ; v e c t o r <s t r i n g > f i l e s ; i f ( ! l i s t F o l d e r ( c o n f i g u r a t i o n [ CONF APPLICATION MEDIAFOLDER ] , files )) { FATAL( Unable t o l i s t f o l d e r %s , STR( c o n f i g u r a t i o n [ CONF APPLICATION MEDIAFOLDER ] ) ) ; return f a l s e ; } s t r i n g f i l e , name , e x t e n s i o n ; s i z e t normalizedMediaFolderSize = 0; s t r i n g mediaFolderPath = n o r m a l i z e P a t h ( c o n f i g u r a t i o n [ CONF APPLICATION MEDIAFOLDER ] , ) ; i f ( ( mediaFolderPath != ) && ( mediaFolderPath [ mediaFolderPath . s i z e ( ) 1 ] == PATH SEPARATOR) ) n o r m a l i z e d M e d i a F o l d e r S i z e = mediaFolderPath . s i z e ( ) ; else n o r m a l i z e d M e d i a F o l d e r S i z e = mediaFolderPath . s i z e ( ) + 1;
176
Abbildungsverzeichnis
37
FOR VECTOR ITERATOR( s t r i n g , f i l e s , i ) { f i l e = VECTOR VAL( i ) . s u b s t r ( n o r m a l i z e d M e d i a F o l d e r S i z e ); s p l i t F i l e N a m e ( f i l e , name , e x t e n s i o n ) ; e x t e n s i o n = lowerCase ( e x t e n s i o n ) ; i f ( e x t e n s i o n != MEDIA TYPE FLV && e x t e n s i o n != MEDIA TYPE MP3 && e x t e n s i o n != MEDIA TYPE MP4 && e x t e n s i o n != MEDIA TYPE M4A && e x t e n s i o n != MEDIA TYPE M4V && e x t e n s i o n != MEDIA TYPE MOV && e x t e n s i o n != MEDIA TYPE F4V && e x t e n s i o n != MEDIA TYPE TS && e x t e n s i o n != MEDIA TYPE NSV) continue ; s t r i n g flashName = ; i f ( e x t e n s i o n == MEDIA TYPE FLV) { flashName = name ; } e l s e i f ( e x t e n s i o n == MEDIA TYPE MP3) { flashName = e x t e n s i o n + : + name ; } e l s e i f ( e x t e n s i o n == MEDIA TYPE NSV) { flashName = e x t e n s i o n + : + name + . + extension ; } else { i f ( e x t e n s i o n == MEDIA TYPE MP4 | | e x t e n s i o n == MEDIA TYPE M4A | | e x t e n s i o n == MEDIA TYPE M4V | | e x t e n s i o n == MEDIA TYPE MOV | | e x t e n s i o n == MEDIA TYPE F4V) { flashName = MEDIA TYPE MP4 : + name + . + extension ; } else { flashName = e x t e n s i o n + : + name + . + extension ; } }
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
207
208
209
210
211 212
38
Abbildungsverzeichnis p a r a m e t e r s [ ( u i n t 3 2 t ) 1 ] . PushToArray ( flashName ) ; } map< u i n t 3 2 t , BaseStream > a l l I n b o u n d S t r e a m s = G e t A p p l i c a t i o n ( )>GetStreamsManager ( )> FindByType ( ST IN NET , t r u e ) ; FOR MAP( a l l I n b o u n d S t r e a m s , u i n t 3 2 t , BaseStream , i ) { p a r a m e t e r s [ ( u i n t 3 2 t ) 1 ] . PushToArray (MAP VAL( i )> GetName ( ) ) ; } V a r i a n t message = G e n e r i c M e s s a g e F a c t o r y : : GetInvoke ( 3 , 0 , 0 , false , 0 , SetAvailableFlvs , parameters ) ; r e t u r n SendRTMPMessage ( pFrom , message ) ;