Мониторинг RTMP-потока, запись при наличии - PullRequest
8 голосов
/ 16 марта 2012

Я ищу способ отслеживать активность в потоке, чтобы я мог определить, идет ли что-либо через поток или нет.Если есть, я начну записывать его, используя rtmpdump.

Я представляю, как это работает, запуская задачу cron, которая проверяет поток каждые 60 секунд.Если он определяет, что поток проходит, вызовите rtmpdump, чтобы начать его запись.Если нет, то ничего не делайте и проверьте снова через 60 секунд.

Так как rtmpdump просто выводит ошибки, когда нет потоковых данных, не кажется хорошей идеей пытаться использовать егодля мониторинга потока, но, возможно, я не прав.

Было бы легко, если бы я делал это вручную на индивидуальной основе, но я пытаюсь автоматизировать задачу автоматической записи потоков, если они доступны.

Имееткто-нибудь сталкивался с способом сделать это?Возможно, некоторые другие инструменты, которые я могу использовать в командной строке (Linux)?Если это поможет, я пишу код для этого, используя Ruby / Rails

Ответы [ 2 ]

2 голосов
/ 20 мая 2015

Вы можете отправить информацию о потоке на стандартный вывод с помощью этой команды:

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

Это попытается записать всего 6 секунд видео и показать, каков был результат.Если поток работает, он выдаст что-то вроде:

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

Если поток не работает / не сможет работать, он выдаст что-то вроде:

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

Вот рабочий пример с общедоступнымпоток rtmp взят из 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

Отсюда с помощью ruby ​​вы можете легко проверить, активен ли один поток или нет (считывая выходные данные для ключевых слов), а затем решить записать илине с обычной командой rtmpdump.После этого вы можете создавать больше логики и циклически обрабатывать массив URL-адресов вместо одного, получая необходимую автоматизацию.

1 голос
/ 15 мая 2015

Может быть, я вас неправильно понял, но почему бы просто не обернуть его вокруг?Если есть поток, я предполагаю, что rtmpdump не выходит, а записывает, пока есть поток.Если потока нет, он выходит, и мы некоторое время спим и пробуем снова.

rtmpdump, похоже, имеет флаг -timeout, поэтому попробуйте установить его на что-то высокое, чтобы уменьшить частоту повторных попыток, возможновсе равно хорошо поспать.

поместите это в record.sh, cmod a + x и запустите

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