RTSP forrás mp4 flv streaming

Ma több hónapos kutatás és munka után sikerült egy működő megoldást készítenem a következő feladatra:

Adott egy IP kamera ami RTSP kiszolgálóként működik egy helyszínen. A követelmény, a kamera élő képét beágyazni egy weboldalba flash video forrásként. Sajnos az első megoldás csak az mp4 forrás konvertálása nélkül, megszakadásokkal tarkítva, a Darwin Streaming Server, és a Videolan program használatával tudott megvalósulni.

Nemrég olvastam a Motion nevű videómegfigyelő rendszer levelezési listáin, hogy valaki RTSP forrást /dev/video0 forrássá alakított openRTSP és ffmpeg segítségével. Ebből jött az ötlet, és az openRTSP, ffmpeg és ffserver segítségével megvalósítottam a feladat megoldásának működő prototípusát. A megoldás flv streaming, RTSP szerver forrásból.

Belefutottam olyan problémába, hogy az ffmpegből kijövő jelet az ffserverbe küldve nem sikerült a streaming. A hiba bennem volt. Az ffserver input formátumként kizárólag ffm formátumot szeret.

A jó parancs ami az ffservernek a jelet megfelelően továbbítja:

openRTSP -v -c -t rtsp://rtsp.server.com/ | \
ffmpeg -r 5 -f m4v -i - http://127.0.0.1:8090/feed1.ffm

Az ffserver.conf alapkonfigja:

Port 8090
BindAddress 0.0.0.0
MaxClients 200
MaxBandwidth 20000
CustomLog /var/log/flvserver/access.log

<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 512000
ACL allow 127.0.0.1
</Feed>

<Stream rtspsource.flv>
Feed feed1.ffm
VideoBitRate 1024
VideoBufferSize 128
Format flv
VideoSize 352x288
VideoFrameRate 5
VideoQMin  3
VideoQMax  3
NoAudio
</Stream>

Ezt a cikket lefordítottam (nem szó szerint) angolra is, mert szerintem érdekes lehet nemzetközi szinten is.

Did you enjoy this post? Why not leave a comment below and continue the conversation, or subscribe to my feed and get articles like this delivered automatically to your feed reader.

Comments

Helo!
Nagyon jo kis iras, de en elakadok :( Odaig mukodik a tortenet, hogy az ffmpeggel ha fajlba dolgoztatom fel az adatot megcsinalja az flv-t. Viszont az ffserver valahogy nem akarja az igazsagot-> a fajlt letrehozza, viszont abbol semmivel sem sikerul kiolvasnom az adatot. Van esetleg otleted, hogy mi lehet?

Az ffserver FFM formátumot fogad, tehát arra ügyelj, hogy az ffmpeg kimente ne FLV legyen, ahogy ezt a cikk vége felé kiemeltem. Esetleg írd ide a parancssort amivel próbálkoztál, meglátjuk mire jutunk.

Szia!

Nagyon láma kérdés… de mégis:
HA már van egy működő rtsp stream (egy ip kamerából jön) akkor azt egyből nem lehet valahogyan az ffmpeg serverrel flv-be vagy swf-be átalakítani?

“egyből” nem. A megoldásom pontosan ezen probléma miatt készült, én nem tudtam azt mondani működő változatban hogy ffmpeg -i rtsp://hosztnev -r 5 -f m4v http://szerver/feed1.ffm

Megint én… bocs
Jobban átnézve itt a dolgokat nem értem…
Kipróbáltam mindent de nem megy.
Van egy vivotek ip kamerám, ebből kijön egy nézhető rtsp stream (mondjuk kizárólag a vlc-vel tudom lejátszani, még a realplayer sem tudja megnyitni..)
Van egy debian serverem amin fut egy apache2 (többek közt) az itt lévő weblapba szeretném webkameraként beágyazni.
Az általad leírtak alapján elindultam.
Az openRTSP szépen megnyitja a streamet de az ffmpeg nem csinál semmit…
“Receiving streamed data (signal with “kill -HUP xxxx” stb.
Csakhogy egyáltalán nincsen ilyen folyamat. tehát rögtön “lehal” elindulás után. Hibaüzenet semmi…
Az ffservert csak simán elindítod vagy kell valami paraméter neki (bár nem sok van a man-jában..)?
Valamit nagyon elcseszek vagy nem értek…
előre is köszi.

Ha nem nagy titok bemásolod ide a parancssort ami számodra nem fut le?

Lefut, csak nem történik semmi..
Íme:
openRTSP -v -c -t rtsp://192.168.0.50/live.sdp| ffmpeg -r 10 -f m4v -i /tmp/feed1.ffm
Ekkor van egy hiba üzenet, mert a feed1.ffm nem létezik ha létrehozom, akkor meg az a gondja hogy nincsen benne codec információ (nyilván hiszen “0” byte).
Ha a elindítom az ffserver-t (backgroundolni kell szegényt)
akkor létrejön egy 4K-s file de az ffmpeg ugyanazt mondja:
“could not find codec parameters” ja és “header damaged”.
Ennyi.
Most már nem is értem… eddig azt hittem, hogy az openRTSP által megnyitott streamet az ffmpeg transcodolja majd az ffserver (a /tmp-ben lévő fájlból) streameli a hálózaton…

És meg is van a hiba. lehagytál egy kötőjelet a -i után ezáltal kimaradt az input STANDARD IN-ről való beszerzése.
A konvertálás részét a ffserver végezné, így amit te leírtál az egy statikus képanyag FFM formában letárolása, és hirtelen nem tudom, azt hogyan adod meg a ffserver forrásaként, de lehet menne. Én azért adtam meg a célnak a http://-t mert így a stream beérkezése a szerverbe TCP-n történik, és később akár a szervertől külön gépre is helyezhető.

Pontsítok, a /tmp/feed1.ffm az a fájl amit a fserver tárol le, így azt a ffmpeg outputjaként nem szabad megadni, ffservernek KELL a http streamen küldeni a ffmpeg kimenetét.

Köszi Gergő!

Sajnos nehéz az agyam kicsit, de most sem értem teljesen…
Van az ffserver, ami (ha jól értem) létrehozza a /tmp/feed1.ffm fájlt. Ebből ő létrehozza a conf-fájl szerint a rtspsource.flv streamet amit a http://serverip:8090/rtspsource.flv url-ről el tudok érni.
Nem értem az openRTSP által megnyitott stream eljutását az ffserverig. Az ffmpeg parancsban csak -i (input van) -http://localhost:8090/feed1.ffm van de ez input. Az a fájl, amit az ffserver létrehozott…
Az általad leírt parancsban a pipe előtt is csak megnyitás van… ha jól látom akkor a -c countinuos, a -t tcp kapcsolaton keresztüli adatok (nem udp), a -v pedig a csak video, tehát “hogy megy be az a nagy elefánt az oroszlán barlangjába” :). Mi lesz a bejövő rtsp stream-mel?
Öreg vagyok és rozsdás az agyam.
Szép kis vasgyúró a fiad… bárcsak megint ekkorák lennének a gyerekeim vagy lenne legalább egy ekkora is :)

Az openrtsp kapcsolói a példában:
-v = video és ez a kapcsoló a STDOUT-ra küldi, így pipeolhat ó bele ffmpegbe
-c = folyamatos lejátszás
-t = TCP fogadás
rtsp://rtsp.server.com/ a forrás URL

ffmpeg kapcsolói a példában:
-r 5 = rate 5kép/sec
-f m4v = bejövő formátum m4v
-i – = input STDIN (ott a kötőjel!)
http://127.0.0.1:8090/feed1.ffm = output a lokál szerverre a 8090 portra a feed1.ffm -be

Remélem így tiszta.

Szia Gergő!

Köszönöm szépen a segítséget.
Sajnos nem sikerül továbbra sem… A vivotek kamera kimenő streamje lesz a gond, mp4v (mp4v-es).
Az ffserver démonként futtatom, ezután jön a:
openRTSP -v -c -t rtsp://192.168.0.50:554/live.sdp | ffmpeg -r 5 -f m4v -i – http://127.0.0.1:8090/feed1.ffm
(-i után – !!! :)
Az openRTSP megnyitja. A pipe-on keresztül az ffmpeg elindul
de a
“Could not read stream parameters from ‘http://127.0.0.1:8090/feed1.ffm'” hibaüzenettel leáll… sajna.
Ide másolom a parancs teljes kimenetét:
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2004 Fabrice Bellard
configuration: –enable-gpl –enable-pp –enable-pthreads –enable-vorbis –enable-libogg –enable-a52 –enable-dts –enable-libgsm –enable-dc1394 –disable-debug –enable-shared –prefix=/usr
libavutil version: 0d.49.0.0
libavcodec version: 0d.51.11.0
libavformat version: 0d.50.5.0
built on Mar 26 2007 15:50:40, gcc: 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Opened URL “rtsp://192.168.0.50:554/live.sdp”, returning a SDP description:
v=0
o=RTSP 24880 15 IN IP4 0.0.0.0
s=RTSP server
c=IN IP4 0.0.0.0
t=0 0
a=charset:Shift_JIS
a=range:npt=0-
a=control:*
a=etag:1234567890
m=video 0 RTP/AVP 96
b=AS:1200
a=rtpmap:96 MP4V-ES/30000
a=control:trackID=1
a=fmtp:96 profile-level-id=3;config=000001B003000001B509000001000000012000C48881F450A041E1463F;decode_buf=76800
m=audio 0 RTP/AVP 97
a=control:trackID=3
a=rtpmap:97 mpeg4-generic/44100/2
a=fmtp:97 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=1210;SizeLength=13; IndexLength=3; IndexDeltaLength=3; CTSDeltaLength=0; DTSDeltaLength=0;

Created receiver for “video/MP4V-ES” subsession (client ports 56688-56689)
Ignoring “audio/MPEG4-GENERIC” subsession, because we’ve asked to receive a single video session only
Setup “video/MP4V-ES” subsession (client ports 56688-56689)
Outputting data from the “video/MP4V-ES” subsession to ‘stdout’
Started playing session
Receiving streamed data (signal with “kill -HUP 4566” or “kill -USR1 4566” to terminate)…

Seems that stream 0 comes from film source: 1000.00 (1000/1) -> 5.00 (5/1)
Input #0, m4v, from ‘pipe:’:
Duration: N/A, bitrate: N/A
Stream #0.0: Video: mpeg4, yuv420p, 320×240, 5.00 fps(r)
Could not read stream parameters from ‘http://127.0.0.1:8090/feed1.ffm’

Végigpróbáltam néhány ffmpeg kodek opciót, ám egyikkel sem megy.
Most feladom… más megoldást kell keresnem, pedig de szép lett volna.
A vlc lejátsza, de a 0.8.6a verzió még nem képes flv stream-et csinálni belőle… (állítólag a 0.9.5 talán már igen). Asf-et tud a vlc de az meg elég vacak minőségű, kis sávszélességen
Hát ennyi, most a webcamxp nevű progival próbálkozom, hátha.
Mégegyszer köszi, bocs az időrabló ökör kérdésekért.
üdv.
Lótetű

ok ez eddig jonak tünik, es szerintem ne add fel, megeri :)

Olyat tudtal-e, hogy a ffmpeg nem http:// celt kap hanem mondjuk test.flv -t?

Kene akkor meg a ffserver konfig amit a “ffserver -f configfile” parancsal elinditottal.

Szia!

nagyon megörültem mikor rátaláltam erre az infóra kipróbáltam, amit leírtál de nekem se akar összejönni ezt a hiba üzenetet kapom:

moricz@moricz-desktop:/etc$ sudo openRTSP -v -c -t rtsp://217.65.106.205:554/morzsostream.sdp | sudo ffmpeg -r 5 -f m4v -i – http://127.0.0.1:8090/feed.ffm
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: –enable-gpl –enable-pp –enable-swscaler –enable-pthreads –enable-libvorbis –enable-libtheora –enable-libogg –enable-libgsm –enable-dc1394 –disable-debug –enable-shared –prefix=/usr
libavutil version: 1d.49.3.0
libavcodec version: 1d.51.38.0
libavformat version: 1d.51.10.0
built on Mar 16 2009 21:16:26, gcc: 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
Opened URL “rtsp://217.65.106.205:554/morzsostream.sdp”, returning a SDP description:
v=0
o=- 1 1 IN IP4 127.0.0.1
s=IPCam
c=IN IP4 0.0.0.0
t=0 0
a=type:broadcast
m=video 0 RTP/AVP 96
a=rtpmap:96 MP4V-ES/90000
a=fmtp:96 profile-level-id=8;config=000001B008000001B58913000001000000012000C488BA98514043C1463F
a=control:track0
m=audio 0 RTP/AVP 8
a=rtpmap:8 PCMA/8000
a=control:track1

Created receiver for “video/MP4V-ES” subsession (client ports 42996-42997)
Ignoring “audio/PCMA” subsession, because we’ve asked to receive a single video session only
Setup “video/MP4V-ES” subsession (client ports 42996-42997)
Outputting data from the “video/MP4V-ES” subsession to ‘stdout’
Started playing session
Receiving streamed data (signal with “kill -HUP 18377” or “kill -USR1 18377” to terminate)…

Seems stream 0 codec frame rate differs from container frame rate: 30000.00 (30000/1) -> 5.00 (5/1)
Input #0, m4v, from ‘pipe:’:
Duration: N/A, bitrate: N/A
Stream #0.0: Video: mpeg4, yuv420p, 640×480, 5.00 fps(r)
Could not read stream parameters from ‘http://127.0.0.1:8090/feed.ffm’

a következő rendszer van összerakva nálam egy ip kamera melynek az elérése:

rtsp://217.65.106.205:554/morzsostream.sdp (ezt eddig csak realmedia playerrel tudtam lejátszatni)

Linux: UBUNTU

a parancs amit kiadtam:

sudo openRTSP -v -c -t rtsp://217.65.106.205:554/morzsostream.sdp | \
sudo ffmpeg -r 5 -f m4v -i – http://127.0.0.1:8090/feed1.ffm

szóval nem értem mit szúrhatok el nagyon jó lenne ha ez müködő képes lenne szeretném az ipkamerámat hanngal és képpel is egy weboldalba ágyazni köszönöm előre is a segítséget

ÜDv

Szia, gyors átgondoltam (kicsit nics agyam ma semmihez):

Ignoring “audio/PCMA” subsession, because we’ve asked to receive a single video session only

Ha jól emlékszem a paraméterekre ott én csak videót vettem alapul. Próbáltad már úgy?

http://www.live555.com/openRTSP/ alapján: a -v az video only
a ffmpegnek pedig én az -r 5 -el a framerate-et levettem 5fps-re

Ez a hibaüzi viszont úgy fest mintha a ffmpeg szerver oldalon lenne gondod:
Could not read stream parameters from ‘http://127.0.0.1:8090/feed.ffm’

Sziasztok

Nekem is az a gondom, hogy adott egy Axis IP CAM, annak a jelet egy serverre kellene streamelni, majd a felhasznalok egy weboldaon keresztul egy flash player segitsegevel nezhessek a cam kepet.

IPCAM (kicsi net sebesseg)-> SERVER (gigabit net sebesseg – ezert o vegezne az uzenet szorast) -> SOK USER

Sikerult megoldani a problemat? Ha igen tudtok e segiteni…

Segitsegeteket elore is koszonom!

Üdvösség!

Nagy lelkesedéssel próbáltam ki a postban foglaltakat, hiszen a játék célja egyezik nálam is.

Nekem olyan tréfát sikerült készítenem a fentieknek megfelelő parancsokkal és konffal, hogy minden klappol, leszámítva azt, hogy amíg az openRTSP-t HUP-pal vagy USR1-gyel meg nem gyilkolom, addig az ffmpeg nem kap semmit. Várhatok például 47 percet és az ffmpeg kimenete még mindig üres. Persze ez üti az ötlet “live” célját.

Minthogy az idő (és a főnök) sürget, lehet én is ide fogok blogolni – már ami ezt a témát illeti :)

Szép napot!
Péter

A legfontosabb, ellenőrizd, hogy az openRTSP kimenetet produkál-e. Addig tovább se menj. ha már sikerült teleszemetelned a konzolod openRTSP-vel akkor próblád meg ffmpeg-be pipeolni.

Szervusz!

Az openRTSP telerakja az stdout-ot, fileba ki is tudom tenni a dolgokat. Próbáltam mplayert/mencodert is hadba fogni, azok is szolgáltatnak jófajta kimenetet.

Az a tréfás, hogy az ffmpeg fileból be tud dolgozni az ffservernek.

Azóta teljesen tiszta virtuálgépbe svn snapshotból megforgattam az ffmpeg-et – eddig ubuntu 9.10 csomagokból dolgoztam, most debian lenny az alap. A végeredmény mindig ugyanaz.

Ha HUP-ot/USR1-et kap az openRTSP, kibújik a szög a zsákból:

COPYPASTE ELEJE
— openRTSP output —
Outputting data from the “video/MP4V-ES” subsession to ‘stdout’
Started playing session
Receiving streamed data (signal with “kill -HUP 22116” or “kill -USR1 22116” to terminate)…
Got shutdown signal
— ffmpeg output —
[m4v @ 0x171d420]Estimating duration from bitrate, this may be inaccurate
Input #0, m4v, from ‘pipe:’:
Duration: N/A, bitrate: N/A
Stream #0.0: Video: mpeg4, yuv420p, 176×132 [PAR 1:1 DAR 4:3], 1k tbr, 1200k tbn, 1k tbc
Output #0, ffm, to ‘http://localhost:8090/feed1.ffm’:
Metadata:
encoder : Lavf52.61.0
Stream #0.0: Video: flv, yuv420p, 352×288, q=3-3, 128 kb/s, 1000k tbn, 5 tbc
Stream mapping:
Stream #0.0 -> #0.0
[mpeg4 @ 0x1726770]warning: first frame is no keyframe
Segmentation fault
COPYPASTE VÉGE

Szép napot!
Péter

Ez néz ki rosszul:
[mpeg4 @ 0x1726770]warning: first frame is no keyframe
Segmentation fault

Nos hát úgy fest, hogy az RTSP forrásommal volt valami (egy indiai televízióadás volt a test stream). Amióta a livemedia tesztutilja szolgáltatja az adást mesefilmből kiharapott kétpercessel, azóta félvidámság van:

Az én küldetésem ugyanis hangot is szolgáltató biztonsági kamerák megfigyelése, audiovizuálisan, jól. Persze teszthardver nélkül tegyem össze tegnapra :)

Térdig gázolva a google-ben most úgy látom, hogy van okom azt hinni, hogy bármilyen ffmpeg által támogatott forma megteszi. Ráadásul mencoder outputja is okés, aminek személy szerint külön örülök, szerethetőbb, mint az openRTSP.

Már két napja ezzel szivolázok, most már rááldozom ezt az estét (is), remélem kedvező fordulatokkal térhetek vissza.

Úgy vélem, ideje megköszönnöm a postot, nagy lendületet adott nekem!

Szép estét!
Péter

Szia!

Van ötleted, hogy nézne ki a parancssor és a config file, ha pl. egy 5 perces file-t szeretnék stream-elni?

Üdv

Vélemény, hozzászólás?

(kötelező)

(kötelező)