Job description
Potrzebne jest rozwiązanie, które będzie przetwarzało w locie strumień multimedialny z sieci do plików w formacie MPEG-DASH (profil live).
Całość może być wykonana albo jako w pełni niezależna aplikacja (uruchamiana na serwerze przez nasze provisionery) albo jako biblioteka Javy, do osadzania w naszej aplikacji, ale w takim wypadku musielibyśmy uzgodnić API.
Wymagany kod źródłowy rozwiązania.
Wymagania funkcjonalne:
- aplikacja musi obsługiwać bez problemu stream do 1080i, więc proponujemy obsługę protokołu RSTP, ale może być inny po uzgodnieniu z naszą stroną;
- jesteśmy w stanie dostosować format streamu do potrzeb aplikacji, tak więc przed rozpoczęciem prac proponuję uzgodnić z nami wymagany format, uważamy, że najwygodniej będzie zastosować MP4/H.264;
- adres strumienia wejściowego musi być odczytywany z parametrów wejściowych aplikacji/przekazywany przez parametr funkcji (jednocześnie będzie mogło być uruchomionych kilka instancji dla różnych strumieni wejściowych);
- drugim argumentem aplikacji/funkcji powinna być ścieżka, w której generowane będą pliki pakietów MPEG-DASH oraz manifest, manifest powinien być zapisany w pliku `manifest.mpd`;
- dodatkowym parametrem będzie plik z konfiguracją, który opisywać będzie docelowe formaty pakietów MPEG-DASH:
- ogólna konfiguracja (na chwilę obecną przede wszystkim długość pojedynczego chunka);
- video (konfigurowalny powinien być ID danego pakietu, rozdzielczość, oraz bitrate),
- audio (konfigurowalny powinien być ID danego pakietu, oraz bitrate);
- aplikacja powinna co zadany okres czasu generować screenshot z jednego z chunków (może to być zrobione jako osobna aplikacja uruchamiana dodatkowo).
Wymagania niefunkcjonalne:
- całość musi być możliwa do uruchomienia i zbudowania na platformie opartej o system Debian Wheezy;
- za "dostępne" można uznać pakiety z repozytoriów Debiana (albo innych repozytoriów Apt, jeśli są udostępniane release'y dla wersji Debian Wheezy), a także repozytoriów paczek dla poszczególnych technologii: Maven (dla Javy i innych opartych o JVM), Ruby Gems (dla Ruby), pip (dla Pythona), Composer (dla PHP), npm (JavaScript), NuGet (C#), Dub (D), go get (Go) itp;
- w przypadku braku paczek należy dostarczyć skrypty automatyzujące budowanie zależności z kodu źródłowego;
- w przypadku języka innego niż C, C++, C#, D, Java (i inne oparte na JVM jak Groovy, Scala), Go, Python, PHP, Ruby, Smalltalk, JavaScript, prosimy o konsultację - chcemy być w stanie samodzielnie wspierać stworzone rozwiązanie;
- w kodzie źródłowym jako znaków nowych linii należy używać \n (Linux line ending), kodowania UTF-8, a jako wcięć 4 spacji (nie tabulacji, ani nie dwóch).
Przykładowe uruchomienie programu (w przypadku implementacji jako niezależna aplikacja):
/usr/local/bin/out-stream-app --input rstp://ip:port/ --output /path/to/channel/directory/ --config streaming.conf
Przykładowa zawartość pliku streaming.conf:
- czas w sekundach
chunkInterval = 5
thumbnailInterval = 30
video(hd-v1) {
width=1920
height=1080
bitrate=4190760
}
video(hd-v2) {
width=1280
height=720
bitrate=2073921
}
video(v3) {
width=854
height=480
bitrate=869460
}
audio(hd-v1) {
bitrate=128000
}
audio(v2) {
bitrate=44100
}
Format wywołań i pliku konfiguracyjnego może być inny, chodziło nam jedynie o zobrazowanie.