Video konvertálás és streaming

Sziasztok!

2014 -et írunk és néhány éves témákat találtam javarészt a témában. Gyorsan fejlődik minden ezért felteszem a kérdést én is. Nem rég volt róla szó nagy vonalakban egy témában hogy hogyan történik egy videó átkonvertálása illetve mivel, milyen erőforrásokkal kellene csinálni. Megoszlott a vélemény, volt aki 2 szervert üzemeltetne, egyik a konvertálásért, másik a webkiszolgálásért lenne a felelős, és volt aki egyben az egészet csinálta volna (persze erős konfiggal). Engem viszont most a komplett téma érdekelne.

Van egy szerver ami egy témával kapcsolatos weboldalt szolgál ki. Most érkeztem el oda hogy a sima képfeltöltés (galériák) után mozgókép feltöltést kéne megvalósítani a felhasználóknak.

- Manapság mibe, hogyan érdemes konvertálni és mivel? A cél jó minőség, de a tárhely is véges bizonyos kereteken belül.
- Milyen stream szervert érdemes használni egy (későbbi esetleges) több Tb -ot meghaladó videószerverhez?
- Eleinte a 100Mbit sávszélesség úgy gondolom elég lesz. Na de később mire számíthatok?
- Egyáltalán mihez érdemes viszonyítani? Mekkora egy átlag videó? Igen tudom, beállítás függő és ezt így nem lehet megmondani. Nem is kell, de valami viszonyítás alap, hogy mekkora diskekre történjen a beruházás majd, hosszútávra. Videónál mire számíthatok? Napi 10-30 videóval számolok
- Témával kapcsolatban tapasztalatok is nagyon érdekelnének!

Nem csináltam még ilyet, talán hasonlót sem. Ezért lenne szükségem a tapasztalatokra. Ha úgy gondoljátok, hogy esélytelen tapasztalat nélkül stabilan felhúzni egy ilyet, azt is elfogadom. Jöhet hideg-meleg. Minden érdekel ami a témába vág.

Hozzászólások

Hát, ugyan nekem nincs eszveszett nagy tapasztalatom, de:

- h264 kodek, mondjuk mp4 konténer, és x264 (http://www.compression.ru/video/codec_comparison/h264_2012/)
- én szeretem az rtmp-t (crtmp szerver) mert jól támogatja a lejátszóm, más a http stream-et részesíti előnyben, lásd alább
- az majd később kiderül
- igen (video hossza, felbontása, témája, típusa - karton vagy render vagy amatőr kézikamera -, a kívánt minőség, stb, ettől mindtől függ, különösen az stb-től)

Ha én most fognék hozzá, akkor alighanem a http stream-et választanám, mégpedig azért, mert ahhoz (talán) könnyebben lehet találni olyan CDN-t mint pl. a Cloudflare. Onnanstól kezdve pedig egy csomó probléma már nem a tiéd. Csak esetleg fizetni kell érte.

A videok méretét meg nincs mese, ki kell próbálni, hogy mekkora lesz azokkal a beállításokkal, amiket jónak látsz. Ugyanazt a mondjuk öt percet le tudom tömöríteni 2M-ra is és 500M-ra is.

Nekem akad némi tapasztalatom benne.

+1 a h264 + mp4-re, jelenleg ez a legjobb választás.
Stream formátum: vagy HTTP progressive download vagy HLS esetleg MPEG-DASH, attól függően, hogy kell-e adaptív bitráta vagy sem, illetve kell-e "rendes" access kontroll a fájloknál. Ha igen, akkor HLS/DASH, ha nem, akkor jó a progressive dl.

Hát igen, a videó mérete csak kb a lábfejem nagyságától nem függ, minden mástól igen, tudni kell, hogy milyen felbontás, milyen hossz, te mit engedsz kijátszani, tárolod-e az eredetit vagy sem.

Csak egy zárójeles megjegyzés: az RTMP-t ma már el kell felejteni, annak ellenére, hogy van egy esetleg két olyan előnye amit talán a progressive download tud (félig), de se a HLS/HDS/DASH/SmoothSteaming nem.

Nekem is van kis tapasztalatom a dologban.
Ahogy már fentebb írták h264 + mp4, mert:
- Adott sávszélesség/tömörítettség mellett jobb képminőséget eredményez.
- A B frame -ek Key framek -mennyiségétől kevéssé függ a file méret
- Nincs nagy méretű meta data csomag

Én viszont semmiképpen nem streamelnék http -n, kizárólag rtmp -n. Wowza Media Server -el van tapasztalat, az remekül működik. Nyilván szóba jöhet a RED5 is, de nem tudom milyen lehet. A http strem azért nehéz ügy mert preload -ot csinál ami akkor gond ha a néző nem nézi végig a filmet, így feleslegesen pocsékoltuk a sávszélt és a néző tárterületét.

Konvertálás az egy nehéz kérdés mivel rendkívül sok lehet a bemenő formátum. Különösképp a mindenféle videó kamerák miatt. Érdemes két lépésben konvertálni a jobb kimenő formátum miatt. Az ideális az lenne, ha parancssorból lehetne videó kártyán konvertálni. Ha ez nem megy, akkor marad a processzor erős gép, sok maggal ffmpeg -el súlyosbítva.

Ehhez nem árt még egy upload szerver és egy ami a thumbnail -eket szolgálja ki (ez akár lehetne egy gép)

Viszont szerintem a legtöbbet abból lehet tanulni, ha belevágsz és a problémákra, amikbe bele botlassz külön-külön keresel megoldást.

----
올드보이
http://molnaristvan.eu/

HTTP Progressive download + byte-range requests - megvan?

Az persze igaz, hogy egy minimális preload van, de azért az nagyon messze van a vészestől.

Az rtmp-vel pedig kizárod az összes mobil-t, mert se androidon, se ios-en, se WP-n nem támogatott.

GPU kódolás: jelenleg még mindig csak ott tartunk, hogy az ffmpeg (x264) CPU-n még mindig agyonver "szinte" bármilyen GPU-t. GPU-n live-ot lehet jól kódolni.

"Ehhez nem árt még egy upload szerver és egy ami a thumbnail -eket szolgálja ki (ez akár lehetne egy gép)" erre viszont nagy +1

GPU kódolás: jelenleg még mindig csak ott tartunk, hogy az ffmpeg (x264) CPU-n még mindig agyonver "szinte" bármilyen GPU-t. GPU-n live-ot lehet jól kódolni.

Ezt azert gondold ujra a HD ready es full HD parameterei menten.

Az rtmp-vel pedig kizárod az összes mobil-t, mert se androidon, se ios-en, se WP-n nem támogatott.

Plusz ez az a protokoll, amit valaki anno megprobalt megtervezni, majd kilepett/meghalt/athelyeztek/megunta az Adobe-nal es egy fosadek lett.

---
pontscho / fresh!mindworkz

Hivatalos Nvidia doksiban olvastam, ha gondolod előkerítem, hogy a full HD esetén vagy 1 streamet valósidő 8x-val tudja, vagy 8 streamet párhuzamosan real-timeban úgy, hogy a beállítások az x264 fast presetjének felelnek meg.

Közben megtaláltam: http://developer.download.nvidia.com/compute/nvenc/v4.0/NVENC_AppNote.p… valósidő 16x tud full HD-nál, "Highest performance" módban ami gyanúm szerint egyenelő az x264 veryfast->ultrafast presetjei valamelyikével.

Szóval óvatosan a GPU-s hype-pal.

http atmegy minden tuzfal/proxy-n, rtmp nem valoszinu.

a video fajl merete egyedul a bitratatol fugg: ha azt allitod be hogy 500kbit/sec, akkor 1 percnyi videod ~4M lesz. az mas kerdes hogy ez egy 320x240-es videohoz eleg, de egy 1080p HD videonal edes keves. szoval neked kell megtalalni a megfelelo erteket.

a h264 lighty/apache modulban nincs sok felesleges savszel pocsekolas, mert pont akkorara allitja be a speed limitet, ami az adott videohoz kell (pl mindig 5 sec-nyi adatot kuld elore)

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

A h.264 nem definial ilyen erteket, h bitrata, csak olyat, h qp. Az osszes bitrata allogatas egy oszver megoldas, ennek megfeleloen jobbara csak ajanlast jelent es a codec donti el, h mennyi lesz a valoban hasznalt bitrata. Legalabbis ha azt akarod, h nehany mosott fos folt mellett legyen ertelmezheto informacio is a kepen.

---
pontscho / fresh!mindworkz

Én viszont semmiképpen nem streamelnék http -n, kizárólag rtmp -n. Wowza Media Server -el van tapasztalat, az remekül működik

Leszamitva azt, h miutan kihajitottuk a fenebe sikerult sajat implementaciokkal a kihozatalt kb. az otszorosere emelni havi berletidij nelkul. Attol nem is beszelve, h CDN-en az rtmp-ert arany drachmaval fogsz fizetni, a http-t kitoljak neked nehany uveggolyoert is es legalabb nem csak a fel internet fogja tudni nezni, mert kizartad a tamogatott formatumokat, mint pl. a HLS-t ios-re es androidra. Vagy a tv-kre. Vagy HTML5 alatt.

Érdemes két lépésben konvertálni a jobb kimenő formátum miatt. Az ideális az lenne, ha parancssorból lehetne videó kártyán konvertálni. Ha ez nem megy, akkor marad a processzor erős gép, sok maggal ffmpeg -el súlyosbítva.

Erdemesnek erdemes, de felesleges. Ugyanis a feltoltott videok minosege, pont azert, h epeszu internet kapcsolat is eleg legyen, a leheto legjobban konvergal a nulla fele. Plusz a Jo Isten vasa nem lenne eleg egy ido utan, hiszen ez a megoldas lefelezi a teljesitmenyt es duplazza a TCO-t.

Es ha jot akarsz, egyre kevesbe hasznalod az ffmpeg-et ilyesmi celra. Indulashoz jo, de utana - foleg ha rtmpzel - jobban jarsz ha zaros idon belul elfelejted.

---
pontscho / fresh!mindworkz

Ez eleg valtozo es jobbara azert nem olcso temakor. En sajatot irtam. Audiora felturboztam egy kicsit a libfaad/libfaac parost, mint referencia codecet, h egy 5 evvel ezelotti xeon-on se nagyon jelentsen koltseget. Videora ugyan a ffmpeg decodere maradt, mert az Intel referencia codec-jei eleg ramaty allapotban vannak, de kep atmeretezesre mar azt hasznalom, mert a libswscale mikor ezt a dontest hoztam nem volt szinhelyes es gyorsabb is volt nala. Encodernek pedig a szokasos x264, direktben, de a Main Concept sem rossz. Vagy a CoreAVC. Valoszinuleg most lesz majd bevezetve emellett az IGD is. Viszont azt tudni kell, h kommercialis celokra hasznalsz h.264-et es/vagy aac-t, akkor fizetsz, mint a katonatiszt. :) Egy x264 licence dollarban merve es nehany ezres tetel az MPEG-LA sarc nelkul. Persze, hasznalhatod helyette a vp8/vp9-et, csak eppenseggel ugy jarsz vele, mint az RTMP-vel. File formatumhoz meg inkabb MP4Box, mint a libavformat mp4 muxere.

---
pontscho / fresh!mindworkz

Adott egy mp4 fájl, az ffmpeg szépen tudja demultiplexelni az audio/video frame-eket, tudom dekódolni is, minden jó. MP4Box-szal csinálok belőle MPEG-DASH multisegment anyagot, ez egy rakás kis mp4-et állít elő. Ha ezeket az mp4-eket megnyitom, akkor a demultiplexer a video frame-eket továbbra is jól adja vissza, az audionál viszont teljes a káosz, rossz méretek, rossz tartalom stb. Valószínűleg azért van, mert az MP4Box az MPEG-DASH-hez szükséges MP4-et állítja elő (ISOBMF), amit az ffmpeg dmx nem ismer, csak a "klasszikus" mp4-et.

(Az ffmpeg-et mi dmx-re, mx-re és audio dekódolásra használjuk, a videó dekódolást a VPU végzi, A/V szinkron, megjelenítés stb. mind saját fejlesztés, elvégre egy STB-ról van szó)

"Leszamitva azt, h miutan kihajitottuk a fenebe sikerult sajat implementaciokkal a kihozatalt kb. az otszorosere emelni havi berletidij nelkul." - Ehh így könnyű :D

Nem védeni akarom a wowzát, de azért annyira nem szar, bár itt-ott hallom, hogy szidják főleg a 2-es szériát. A 3.6-tól fölfele meg hallok egész meredek dolgokat a teljesítményéről - jó értelemben.

Nálunk teszi a dolgát rendesen.

Megj: ha pusztán arra kell, hogy vod-ot vagy live-ot chunkoljon HLS-re mindenféle viccesség* nélkül akkor arra lehet, hogy nem a legjobb választás a wowza.

*stream access kontroll / DRM / egyebek.

HDS/HLS/DASH esetén már by default korlátozott a preload minden playerben. Valamikor a pszeudóstreaming korában volt az trend, hogy húzóra lekapta a player a fájlt, de már elmúlt.

Az rtmp az 1 ujjamon megszámolható előnyét leszámítva halott protokoll ha a téma a nézők tömegének kiszolgálása. Szerintem.

Ami IPTV streamünk nekünk itt van, az mind MPEG-TS konténerben jön MPEG2 vagy H264 kódolással. Bitrate-ek (MPEG2/H264, SD/HD) a 600 kbps-től a 12 Mbps-ig változnak, sőt olyan is van, hogy egy adott műsorfolyamon belül hirtelen megváltozik, pl. egy sportközvetítés jöhet nagyjából fix sebességgel, aztán beiktatnak egy reklámot, ami meg csak ötödakkora sávszélességet visz el. Vannak csatornák egy hangstreammel, aztán van, ahol van vagy hat (pl. Euronews).

MPEG-DASH pedig megy MP4-gyel és MPEG-TS-sel is, igaz, ha jól tudom az összes funkciójának kihasználásához MP4-et kell használni.

Transzkódoláshoz kezdeti tapasztalatszerzés céljából jó lehet még akár a VLC is, vagy az ffmpeg.

Csak pornó. A többi vesztességes lesz és mindegy, hogy kódolod.

Lehet troll leszek, de nekem eszembe nem jutna sajat streaming megoldasban gondolkodni, hacsak nincs kiscsillo penzed vagy idod es hozzaertesed, esetleg mindharom egyutt. Van uStream/Twitch/YouTube streamelesre, van YouTube videokra, minden konverziot elvegeznek helyetted, es eleg szeles tamogatottsag is van hozzajuk. Raadasul mindegyik szolgaltato eleg szeles forrasanyag-palettat fogad, es ingyen atkonvertaljak neked arra, amire nekik jo.

Sajat megoldast akkor kell elkezdeni uzemeltetni, amikor mar annyi penzed van, hogy megeri.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.