监控 RTMP 流,如果可用则记录

Posted

技术标签:

【中文标题】监控 RTMP 流,如果可用则记录【英文标题】:Monitor RTMP stream, record if available 【发布时间】:2012-03-16 14:05:00 【问题描述】:

我正在寻找一种方法来监视流上的活动,以便确定是否有任何东西通过流。如果有,我会开始使用 rtmpdump 录制。

我想这是通过运行一个每 60 秒检查一次流的 cron 任务来实现的。如果它确定流正在通过,则调用 rtmpdump 开始记录它。如果不是,则什么也不做,并在 60 秒后再次检查。

由于 rtmpdump 只是在没有流数据时出现错误,因此尝试使用它来监视流似乎不是一个好主意,但也许我错了。

如果我根据具体情况手动执行此操作会很容易,但我正在尝试自动执行自动记录流(如果可用)的任务。

有没有人遇到过这样做的方法?也许我可以在命令行(linux)中使用其他一些工具?如果有帮助,我正在使用 Ruby/Rails 编写代码

【问题讨论】:

有一种通过 Red5 媒体服务器进行信号检测的方法。另外我认为您还可以在 VLC 进程上设置侦听器。我无法向您提供详细信息,因为我从未这样做过,但我在两组文档中都看到了与此相关的内容。希望有帮助 【参考方案1】:

您可以使用以下命令将流的信息发送到标准输出:

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,从而获得所需的自动化。

【讨论】:

【参考方案2】:

也许我误解了你的意思,但为什么不把它绕起来呢? 如果有流,我假设 rtmpdump 不会退出,但只要有流就会记录。如果没有流,它会退出,我们会睡一会儿,然后再试一次。

rtmpdump 似乎有一个 --timeout 标志,因此请尝试将其设置为较高的值以降低重试率,但无论如何还是好好睡觉吧。

把它放在一个record.sh中,cmod a+x并运行它

while true; do 
  rtmpdump ...
  sleep 60
done

【讨论】:

以上是关于监控 RTMP 流,如果可用则记录的主要内容,如果未能解决你的问题,请参考以下文章

海康API——获取监控点预览取流URL,获取的rtmp流不能播放

音频流哪个更安全:RTMP 还是 HTTP 流?

TSINGSEE青犀视频RTMP推流摄像头焦距与监控距离存在什么关系?

视频播放压缩的相关知识点:I帧P帧B帧RTMP协议RTSP协议GB28181协议等学习记录

RTMP协议实现视频直播流实战

RTMP