Stream Szerver Implementálás (Project)

Audio- és videoállományok on-Demand stream-elése

Állásajánlat

Közel másfél évtizedes múlttal rendelkező, könyvkiadással és könyvterjesztéssel foglalkozó budapesti cég egyszeri project alapon keresi szoftverfejlesztő/tanácsadó/rendszergazda partnerét csapat vagy cég vagy principal/senior szabadúszó formájában.

Frissítés

A project fejlesztési szempontból kész, már csak Rendszergazdát keresünk, aki segít nekünk konzisztens módon feltelepíteni egy Debian Linuxot, rajta a WoWZával. A WoWZa telepítése egyszerű: 3 promptot dob ki telepités alatt, a serialnumber megadása, belépési név és jelszó bekérése, és egy kérdés, hogy automatikusan induljon-e a services (yes). A többi tiszta sor volt. Viszont sok portot használ, tehát ezeket majd IPTables-ben be kell állítani. Satöbbi.

Telepítési naplóm alul olvasható, a php mintakódok a DevOps-ra nem vonatkoznak.

Amit szeretnénk:

Megoldási terv:

Röviden és összegezve egy On-Demand tárhelyre van szükségünk, ami lehet saját kialakítású, vagy akár lehet egy szolgáltatás is, feltéve, hogy versenyképes az ajánlat a saját vashoz képest. Csak tudja a fentebb említett paramétereket.

Ami kész:

A webszerver készen van, (a webshop és annak a beléptetési rendszere nem része a feladatnak, ez késznek tekintendő), ennek a csak regisztrált felhasználók részére hozzáférhető részébe kell megjeleníteni a videókat HTML5 alapon.

Elvárások

Zöldmezős alapokról indulva „kulcsrakész” állapot megvalósítása. A vasat mi biztosítjuk, telepítés, konfigurálás, testreszabás, beüzemelés a feladat.

Egyéb tanácsadás: milyen videoformátumban kérik a hang- és videoállományokat feltölteni, satöbbi. A weboldalon megjelenített videoformátumot a HTML5 szabvány egyébként is behatárolja.

Gyorsan tudják magukat képbe hozni például WoWZa szerver oldali kódolásban, a developer tutorialja jó, sok mintamegoldást is tartalmaz JAVA nyelven. (DevOps-ra ez rész nem vonatkozik.)

Amennyiben a megoldás nem interpretált, akkor legalább 3év RunTime Error garancia. (DevOps-ra ez rész nem vonatkozik.)

Amennyiben - és pl WoWZa esetében - az effektív kódolásra fordított szoftvermérnöki munkaórák száma meghaladja a 10 munkaórát, akkor a kódbázis kód-audit-ra történő előkészítése dokumentálással. (Most - ennek a projectnek a keretén belül - internshipperek és juniorok jelentkezését nem várjuk, mert perpill nincs rá kapacitásunk.) (DevOps-ra ez rész nem vonatkozik.)

Amit tudunk:

Gyakorlatilag semmi. Még arról sincsen elképzelésünk, hogy milyen programnyelven íródjon meg a kód. Nyilván abban, ami optimális mind létesítési, mind pedig üzemeltetési költség vonatkozásában.

Számunkra mindenképp elfogadhatatlan a „fapados” megoldás, mármint, hogy először a böngésző letölti a teljes állományt, majd cache-ből lejátssza azt. Egyfelől jogvédett a tartalom, másfelől iszonyatos hálózati adatforgalmat kummulálna, mivel az állományok lejátszási hossza 30-60perc.

Amennyiben van kész lib, ami megvásárolható licence-ű (akár 3. fél által írt), és csak testre kell szabni, számunkra az is elfogadható. Amit eddig találtunk WoWZa (Reseller EU-n belül: UK (Technikai specifikáció az angol oldalon), Poland, ennek a lifetime licence $1995 netto), ami - ahogy olvasom - Java alapú. Itt kéne valami konkurens termék is, amivel össze lehet vetni, hogy melyik gyorsabb, hatékonyabb.

Csak elképzelés: authentikáció kapcsán, az auth a jelenlegi szerveren történik, tehát pl socketen keresztül történhet a sessionID átadása a streamszervernek, amit naplóz, majd a video/audió meghívásakor GET paraméterrel adnánk át a kliens oldalról a sessionID-t. De ha ennél jobb megoldás is van, ami üzembiztos, akkor ez csak ötlet volt, nem egyéb. Például a WoWZa támogatja a SecureToken-t. Ebben meg lehet adni IPcímet, illetve jelszót, aminek segítségével hashkódolva egy tokent állít elő, ami meghatározott időablakon belül érvényes lejátszásra.

Debian Linux szerverben gondolkodunk.

Telepítési folyamat:

debian 9.8 telepitése mini.iso -ból 1munkaóra
webserver 
sshserver

apt-get install php
php7 települ

apt-get install php-gd
apt-get install php-xmlrpc
apt-get install php-imap
apt-get install php-xml


apt-get install mysql-server
apt-get install mysql-client
mysql5.5 települ

apt-get install php-mysql


apache2 ssl.conf és
apache2 ssl.load és
apache2 socache_shmcb.load
apache2 proxy.conf
apache2 proxy.load
symlinkek készitése a /etc/apache2/mods.enabled könyvtárba


ez nem kell, csak komment arra az esetre, ha ssl-t akarunk proxyval a managerre: apache2 ports.conf hozzáadni: Listen 8080 apache2 proxy.conf hozzáadni IfModule-n belül: <VirtualHost *:8080> ProxyPass / http://127.0.0.1:8088/ </VirtualHost> ebben az esetben a 8080-as porton lehet majd felsetupolni a https-t a managerre.
/etc/php/php.ini max_execution_time = 0; max_input_time = -1; post_max_size = 0 (eredeti volt 8M) upload_max_filesize = 0 (eredeti volt 2M) apache restart
wowza letöltése, telepitése 10perc https://www.wowza.com/pricing/installer teszt, a wowza fut: https://www.wowza.com/docs/how-to-install-and-configure-wowza-streaming-engine 5perc TODO: az inditóállomány beintegrálása a /etc/init.d/ könyvtárba, mert nem találom ott. (parancssoros újrainditás lehetősége) /usr/loal/WowzaStreamingEngine/bin/WowzaStreamingEngine /usr/loal/WowzaStreamingEngine/manager/bin/WowzaStreamingEngineManager http://192.168.1.88:8088/enginemanager belépés a telepitéskor megadott jelszóval tesztvideo megnézése 10perc - nagyon aranyos rajzfilm
https://www.wowza.com/docs/how-to-create-a-self-signed-ssl-certificate Saját kulcs generálása az alábbi paranccsal történik: cd /usr/local/WowzaStremaingEngine/conf keytool -genkey -keysize 2048 -alias wowza -keyalg RSA -keystore ssl.mycompany.com.jks Ki kell tölteni egy űrlapot cég- és szerveradatokkal és egy aláíró jelszóval, további hint a fenti linken angolul. Ez jks kiterjesztésű kulcsot generál. Beintegrálása a VHost.xml file-ba történik, a kikommentezett részt kell unkommentezni. A port legyen 1936 és nem 443. A 443-as port foglalt a sima https miatt. Problémák a self-signed kulccsal: a böngészők biztonsági kivételt kérnének, de embed beillesztés esetén ez a folyamat nem indul el, hanem lehal a wowzaPlayer. Megoldás: saját, például comodo ssl kulcs vásárlása: https://www.ssls.com/ https://www.wowza.com/docs/How-to-request-an-SSL-certificate-from-a-certificate-authority https://ssl.comodo.com/support/ssl-technical-faqs/certificate-installation-java-based-web-servers-tomcat-using-keytool.php service WowzaStreamingEngine restart
néhány ötlet iptableshez + az 1936-os port az ssl-hez: iptables -I INPUT -p tcp --dport 80 -j ACCEPT iptables -I INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT iptables -I INPUT -p tcp --dport 1935 -j ACCEPT iptables -I OUTPUT -p tcp --dport 8080 -j ACCEPT iptables -I INPUT -p tcp --dport 8087 -j ACCEPT iptables -I INPUT -p tcp --dport 8083 -j ACCEPT iptables -I INPUT -p tcp --dport 8084 -j ACCEPT iptables -I INPUT -p tcp --dport 8086 -j ACCEPT iptables -I INPUT -p tcp --dport 8088 -j ACCEPT /etc/init.d/WowzaStreamingEngine restart iptables -I INPUT -p tcp --dport 8087:8088 -j ACCEPT iptables -I INPUT -p udp -m udp --dport 6970:9999 -j ACCEPT ************* iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 80 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 443 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 3306 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 22 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 1935 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 8088 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 8086 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 8087 -j ACCEPT iptables -A INPUT -p tcp -m tcp –dport 544 -j ACCEPT iptables -A INPUT -p udp –match multiport –dports 6970:9999 -j ACCEPT iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
előkészületek az ffmpeg használatához 40perc videoelőkonvertálás script megírása 1munkaóra: videosmilfile generálás (adaptív bitráta) script megírása 1munkaóra: 16:9. 4320p: 7680×4320 2160p: 3840×2160 1440p: 2560×1440 1080p: 1920×1080 720p: 1280×720 1647000 480p: 854×480 954000 360p: 640×360 668000 240p: 426×240 412000 144p: 256×144 254000 apt-get install ffmpeg # -y overwrite existing # -n do not overwrite existing ffmpeg -loglevel quiet -n -i sample.mp4 -vf scale=256:144 sample-144p.mp4 ffmpeg -loglevel quiet -n -i sample.mp4 -vf scale=426:240 sample-240p.mp4 ffmpeg -loglevel quiet -n -i sample.mp4 -vf scale=640:360 sample-360p.mp4 ffmpeg -loglevel quiet -n -i sample.mp4 -vf scale=854:480 sample-480p.mp4 ffmpeg -loglevel quiet -n -i sample.mp4 -vf scale=1280:720 sample-720p.mp4 ffmpeg -loglevel quiet -n -i sample.mp4 -vf scale=1920:1080 sample-1080p.mp4 file és könyvtárjogosultságok beállitása! <?php function getVideoFromUpload($verbose=false){ move_uploaded_file($_FILES['feltoltes'][tmp_name],"/home/wowza/wowzaupload/".preg_replace("/\s/","_",$_FILES['feltoltes'][name])); getVideosFromUploadDir($verbose); }; function getVideosFromUploadDir($verbose=false){ $out = opendir("/home/wowza/wowzaupload"); $tomb = array(); while($temp = readdir($out)){ if(!in_array($temp,array(".","..","archiv"))){ $tomb[]=$temp; }; }; closedir($out); foreach($tomb as $ertek){ videoConvert("/home/wowza/wowzaupload/","/home/wowza/wowzaupload/archiv/",$ertek,$verbose); exec("mv -f /home/wowza/wowzaupload/".$ertek." /home/wowza/wowzaupload/archiv/".$ertek); }; }; function videoConvert($sourcepath="./",$targetpath="./",$filename,$verbose=false){ // ffmpeg -y overwrite existing // ffmpeg -n do not overwrite existing $tomb = array( "144"=>array("256","144","254000"), "240"=>array("426","240","412000"), "360"=>array("640","360","668000"), "480"=>array("854","480","954000"), "720"=>array("1280","720","1647000"), //"1080"=>array("1920","1080") ); $nameprefix = md5($filename); foreach($tomb as $kulcs => $ertek){ exec("ffmpeg -loglevel quiet -n -i ".$sourcepath.$filename." -vf scale=".$ertek[0].":".$ertek[1]." ".$targetpath.$nameprefix."-".$kulcs."p.mp4"); exec("mv -f ".$targetpath.$nameprefix."-".$kulcs."p.mp4 /usr/local/WowzaStreamingEngine/content/".$nameprefix."-".$kulcs."p.mp4"); if($verbose){ echo "<div>".$nameprefix."-".$kulcs."p.mp4 generated</div>"; }; if($verbose){ echo "<div>http://192.168.1.88:1935/vod/mp4:".$nameprefix."-".$kulcs."p.mp4/manifest.mpd</div>"; }; }; $str = "<"."?xml version=\"1.0\" encoding=\"UTF-8\" ?".">\n"; $str.= "<smil title=\"\">\n"; $str.= " <body>\n"; $str.= " <switch>\n"; foreach($tomb as $kulcs => $ertek){ $str.= " <video height=\"".$ertek[1]."\" src=\"".$nameprefix."-".$ertek[1]."p.mp4\" width=\"".$ertek[0]."\">\n"; $str.= " <param name=\"videoBitrate\" value=\"".$ertek[2]."\" valutetype=\"data\"></param>\n"; $str.= " </video>\n"; }; $str.= " </switch>\n"; $str.= " </body>\n"; $str.= "</smil>"; if($fin = fopen("/usr/local/WowzaStreamingEngine/content/".$nameprefix.".smil","w")){ fwrite($fin,$str); fclose($fin); }; }; ?>
WoWZa Player kiismerése és beintegrálása tesztoldalba 1munkaóra
Jelszavas és IPvédelem (tokenes authentikáció) beállítása (scriptírás) 1munkaóra: <?php function urlgen($stream,$urlencode=true){ $clientIP = $_SERVER['REMOTE_ADDR']; $host = "192.168.1.88:1935"; $url= "http://".$host."/"; $start = time(); $end = strtotime("+300 minutes"); $secret = "xyz123456"; $tokenName = "mytoken"; $hashtomb = array($clientIP,$secret,$tokenName."starttime=".$start,$tokenName."endtime=".$end); sort($hashtomb); $hashstring = $stream; $sep = "?"; foreach($hashtomb as $ertek){ $hashstring .= $sep.$ertek; $sep="&"; }; $hash = hash('sha256', $hashstring, true); $base64Hash = strtr(base64_encode($hash), '+/', '-_'); $params = array($clientIP,$tokenName."starttime=".$start, $tokenName."endtime=".$end, $tokenName."hash=".$base64Hash); $playbackURL = $url.$stream."/playlist.m3u8"; if(preg_match("/(rtmp)/",$url)){ $playbackURL = $url.$stream; }; $sep = "?"; foreach($params as $ertek){ $playbackURL.= $sep.$ertek; $sep = "&"; } if($urlencode){ return urlencode($playbackURL); }else{ return $playbackURL; }; }; ?>
Egyéb előkészületek 1munkaóra Egyéb dokumentálás 1munkaóra

Jelentkezés

Jelentkezni az utasirobert kukac gmail pont com emailcímen lehet tételes árajánlatokkal. Lehetőség szerint több árajánlatot is kérnénk a többféle megoldási javaslatra. Mindenképp szükségünk van erőforrásigény-becslésre (memória, processzoridő).

Várom jelentkezéseteket. Köszönöm.