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
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?
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.
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…
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
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ű
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
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
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
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
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?