[MEGOLDVA] videó TCP streamen, ami bárhonnan kezdve lejátszható

Fórumok

Olyan rendszert szeretnék csinálni, amiben egy videó forrás TCP streamként tolja a videót a klienseknek. A kliensen a TCP csatornát csak bestreamelem egy lejátszóba (pl ffplay), és már látom is a távoli videót.

Az egészet először a lehető legegyszerűbben parancssori eszközökkel szeretném összerakni. Ami megvan:

Ez a parancs gyártja a streamet webkamera alapján. Itt egy fájlba irányítva, de ez lesz TCP-n is kiszolgálva:

$ ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 -f avi - >video.example

Ez a parancs játssza le. Itt egy fájlból, de élesben majd TCP streamről:

$ ffplay - <video.example

Eddig minden oké, működik is. Viszont ha a "közepétől" kezdem, akkor nem működik (ha a c értéke bármilyen kisebb érték, mint a teljes fájlméret):

$ tail -c 738130 video.example |ffplay -

Nyilván azért nem működik, mert nem tud a streamre rászinkronizálni a lejátszó.

A kérdés az, hogy van-e olyan paraméterezés (Linuxon elérhető tetszőleges codec és multiplexer konténer használható és tetszőleges lejátszó), amik mellett az elképzelt rendszer működhet? Tehát ami valahogy automatiusan szinkronizál a streamre, és az első dekódolható frametől kezdve kezdi a lejátszást?

Szerk.: Köszönöm a segítséget mindenkinek!

Megoldás, hogy streamelhető formátumot kell választani, pl mpegts.

Stream indítása kameráról: $ ffmpeg -f v4l2 -framerate 20 -video_size 160x120 -i /dev/video0 -f mpegts -

Dekódolásnál a probe-ok méretével játszogatni kell, hogy hamar el tudjon indulni a dekódolás:

Client side: $ ffmpeg -analyzeduration 0 -fpsprobesize 0 -probesize 32000 -f mpegts -i - -vf scale=80:60 -f rawvideo -pix_fmt bgr24 -

Végül önálló megjelenítő program helyett a nyers képkockák pipe-on keresztül jutnak be egy saját megjelenítőbe, úgy kerülnek képernyőre. Tehát ffplay nincs használatban. Lásd: http://hup.hu/node/151733

Hozzászólások

Az AVI konténer nem streamelhető, és a megfelelő kodek kiválasztása is fontos.

Ha hálózaton kereszül akarod nézni, akkor javaslom kifejezetten az erre a célra kitalált formátumokat használni. TCP felett ki tudsz tolni nyers streamet is megfelelő konténerben/formátumban, de én sokkal inkább javaslom HTTP alapú pszeudo-streamek használatát. (manapság leginkább MPEG DASH, de ebben a ligában játszik a Apple HLS, az Adobe HDS, és a Microsoft SmoothStreaming is.)

Írd be a gugliba az alábbi kulcsszavakat: ffmpeg dash streaming

A HTTP alapú pseudo streamet úgy képzeld el, mint pár másodperces, önállóan letölthető videófájlokat, és egy hozzá tartozó, az adott szegmenseket tartalmazó, generált playlistet. Mindezek sima HTTP GET-tel letölthetőek, és lejátszáskor összerakhatóak. Pont azért terjedt el, mert könnyebb vele dolgozni, mint egy valódi stream-mel. (Átmegy bármilyen szabványos HTTP proxy-n, stb.)

ffmpeg -i ... -f mpegts tcp://0.0.0.0:1234?listen

ffplay tcp://1.2.3.4:1234

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