我正在寻找一种方法来监控流上的活动,以便我可以确定流中是否有任何内容。如果有,我将开始使用rtmpdump录制它。
我想这可以通过运行一个每60秒检查一次流的cron任务来完成。如果它确定流正在通过,则调用rtmpdump开始记录它。如果没有,那么什么也不做,并在60秒内再次检查。
由于rtmpdump只是在没有流数据时出错,所以尝试使用它监视流似乎不是一个好主意,但也许我错了。
如果我手动逐个进行此操作会很容易,但是如果可用的话,我会尝试自动记录流的任务。
有没有人遇到过这样做的方法?也许我可以在命令行(linux)中使用其他一些工具?如果它有帮助,我正在使用Ruby / Rails编写代码
答案 0 :(得分:2)
您可以使用以下命令将流的信息发送到stdout:
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
以下是一个工作示例,其中包含取自VLCStreamTester的公共rtmp流:
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而不是一个URL,从而获得所需的自动化。
答案 1 :(得分:1)
也许我误解了你,但为什么不绕过它呢? 如果有一个流,我假设只要有一个流,rtmpdump就不会退出但是记录。如果没有流,它会退出,我们会睡一会儿再试一次。
rtmpdump似乎有一个--timeout标志,所以尝试将其设置为高,以降低重试速度,尽管如此可能还是很好的休眠。
把它放在record.sh中,cmod a + x并运行它
while true; do
rtmpdump ...
sleep 60
done