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
- 1493 megtekintés
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 hozzászóláshoz be kell jelentkezni
Köszi! Meg fogom nézni.
Http nem játszik, mindenképpen "nyers" TCP-re lenne szükségem, mert egy egyedi megoldásba kell beépülnie a streaming résznek. Tehát teljes szervert nem tudok beemelni, csak egy nyers streamet tudok átvinni.
- A hozzászóláshoz be kell jelentkezni
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.)
- A hozzászóláshoz be kell jelentkezni
Ha mindenáron csak nyers TCP streamet tudsz átvinni, akkor MPEG Transport Stream konténer !konténer, és nem kodek (ez van egyébként a DASH-ban is az MP4 mellett).
Pont arra van kitalálva amire te szeretnéd.
Ez van a DVB-C/T/S mögött.
- A hozzászóláshoz be kell jelentkezni
+1 MPEG-TS
- A hozzászóláshoz be kell jelentkezni
Köszi! Ez lett végül. Legalábbis mpegts, az enkódert nem állítottam be explicit, egyelőre az van amit az ffmpeg magától ad.
- A hozzászóláshoz be kell jelentkezni
Icecast2 + WebM FFmpeggel
Ezt próbáld: https://wiki.xiph.org/Icecast_Server/Streaming_WebM_to_Icecast_with_FFm…
-------------------
http://streamstat.hu/ - A legtöbb magyar rádió és TV egy helyen!
- A hozzászóláshoz be kell jelentkezni
[Feliratkozás]
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Ezt igy ne, mert out-of-memory-val el fog szallni az ffmpeg ha capture devicet nyitsz meg.
Helyette: udp://0.0.0.0:1234
- A hozzászóláshoz be kell jelentkezni