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.

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. Ami itt feladat, az auth átexportálása/importálása (pl socketen keresztül) a streamszerverre. A webszerver php alapon fut.

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 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 symlinkek készitése a /etc/apache2/mods.enabled köynvtárba hibajavitás az ssl.conf könyvtárban. 43. sor komment out és fut.

/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)

http://192.168.1.88:8088/enginemanager
belépés a telepitéskor megadott jelszóval

tesztvideo megnézése 10perc - nagyon aranyos rajzfilm

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!

videoelőkonvertálás script megírása 1munkaóra:
videosmilfile generálás (adaptív bitráta) script megírása 1munkaóra:

<?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);
  };
  
};

?>




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.