2012-03-16 9 views
8

Szukam sposobu monitorowania aktywności w strumieniu, dzięki czemu mogę określić, czy coś jest przesyłane przez strumień, czy nie. Jeśli tak, zacznę nagrywać go za pomocą rtmpdump.Monitoruj strumień RTMP, nagrywaj, jeśli jest dostępny.

Wyobrażam sobie, że to działa, uruchamiając zadanie cron, które sprawdza strumień co 60 sekund. Jeśli stwierdzi, że nadchodzi strumień, wywołaj rtmpdump, aby rozpocząć jego nagrywanie. Jeśli nie, nie rób nic i sprawdź ponownie za 60 sekund.

Od rtmpdump po prostu rodzaj błędów, gdy nie ma danych strumienia, nie wydaje się, że byłoby dobrym pomysłem, aby spróbować użyć go do monitorowania strumienia, ale może się mylę.

Byłoby łatwo, gdy robiłem to na zasadzie indywidualnej ręcznie, ale staram się zautomatyzować zadanie nagrywania strumieni automatycznie, jeśli są one dostępne.

Czy ktoś ma sposób na zrobienie tego? Być może niektóre inne narzędzia, których mogę używać w linii poleceń (Linux)? Jeśli to pomaga, piszę kod do tego przy użyciu Ruby/Rails

+0

Istnieje sposób na wykrycie sygnału za pośrednictwem serwera multimedialnego Red5. Myślę również, że możesz także ustawić słuchaczy w procesie VLC. Nie mogę podać szczegółów, ponieważ nigdy tego nie robiłem, ale widziałem rzeczy związane z tym w obu zestawach dokumentacji. mam nadzieję, że pomaga – Alex

Odpowiedz

1

Może źle cię zrozumiałem, ale dlaczego nie po prostu go obejść? Jeśli istnieje strumień, zakładam, że rtmpdump nie kończy się, ale nagrywa, dopóki jest strumień. Jeśli nie ma strumienia, wychodzi i śpimy przez chwilę i spróbujmy ponownie.

rtmpdump wydaje się mieć flagę --timeout, więc spróbuj ustawić to na coś wysokiego, aby zmniejszyć szybkość prób, prawdopodobnie dobrze spać.

umieścić to w record.sh, cmod a + x i uruchomić go

while true; do 
    rtmpdump ... 
    sleep 60 
done 
2

Można wysłać informacje do strumienia stdout z tym poleceniem:

rtmpdump -v -m6 -B6 -r "rtmp://#{URL}" -o /tmp/test.flv &> /tmp/rtmpdump.info; cat /tmp/rtmpdump.info 

to postara nagrać tylko 6 sekund wideo i pokazać, jaki był wynik. Jeśli strumień jest uruchomiony to będzie coś wyjście jak:

INFO: Connected... 
Starting Live Stream 
For duration: 6.000 sec 
INFO: Metadata: 
INFO: trackinfo: 
INFO: timescale    50000.00 
INFO: length    19686000.00 
INFO: language    eng 
INFO: sampledescription: 
INFO: sampletype   avc1 
INFO: timescale    48000.00 
INFO: length    18900992.00 
INFO: language    eng 
INFO: sampledescription: 
INFO: sampletype   mp4a 
INFO: audiochannels   2.00 
INFO: audiosamplerate  48000.00 
INFO: videoframerate  25.00 
INFO: aacaot    2.00 
INFO: avclevel    31.00 
INFO: avcprofile   77.00 
INFO: audiocodecid   mp4a 
INFO: videocodecid   avc1 
INFO: width     1047.00 
INFO: height    576.00 
INFO: frameWidth   720.00 
INFO: frameHeight   576.00 
INFO: displayWidth   1047.00 
INFO: displayHeight   576.00 
INFO: framerate    25.00 
INFO: moovposition   32.00 
INFO: duration    393.77 
2033.613 kB/6.02 sec (1.5%) 
Download may be incomplete (downloaded about 1.50%), try resuming 

Jeśli strumień nie działa/nie to wyświetli coś jak:

RTMPDump v2.4 
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL 
Connecting ... 
INFO: Connected... 
ERROR: Closing connection: NetStream.Play.Failed 

Oto przykład pracy ze strumieniem RTMP publicznej pobranej od VLCStreamTester:

require 'open3' 

rtmp_url = "stream.streetclip.tv:1935/live/high-stream" 
command  = "rtmpdump -v -m6 -B6 -r \"rtmp://#{rtmp_url}\" -o /tmp/test.flv &> /tmp/rtmpdump.info; cat /tmp/rtmpdump.info" 

Open3.popen3(command) do |i, o, e, t| 
    puts o.read 
end 

Stąd z rubinem można łatwo sprawdzić, czy jeden strumień jest włączony czy nie (czytanie wyjście dla słów kluczowych), a następnie zdecydować, czy nie nagrać z zwykle polecenie rtmpdump. Po tym można zbudować więcej logiki i przechodzić przez szereg adresów URL zamiast jednego, uzyskując automatyzację, której potrzebujesz.

Powiązane problemy