Flex 中的 RTSP
Posted
技术标签:
【中文标题】Flex 中的 RTSP【英文标题】:RTSP in Flex 【发布时间】:2009-04-20 10:29:16 【问题描述】:我们目前正在开发一个 Flex 应用程序,该应用程序需要通过 RTSP 连接到一组交通检测摄像头。总的来说,我对视频流世界是全新的,我想知道这是否可能。
AFAIK 无法在 Flash 播放器中使用 RTSP 提要,因此我认为我们需要在服务器上安装某种转换器来获取 RTSP 流并将其转换为 RTMP,以便我们可以使用输入我们的 Flex 应用程序。我们希望 Red5 可以帮助我们做到这一点。
我的假设是否正确,有人这样做过吗?
【问题讨论】:
【参考方案1】:Wowza Media 似乎支持 RTSP 到 RTMF 的转换:http://www.wowzamedia.com/comparison.html
还有基于Red5和FFMPEG的通用视频流转码器Xugglehttp://www.xuggle.com/。
【讨论】:
【参考方案2】:您可以尝试通过 Red5 重新流式传输并将您的 Flex 应用程序连接到 Red5 服务器。
阅读更多:http://red5wiki.com/wiki/SteamStream
【讨论】:
【参考方案3】:基于this work 我试图将 H264 信号转换为 SWF 流 很容易在 Flash 中显示。这是食谱。 (这个食谱是 对于 Linux。)
从http://www.live555.com/liveMedia/下载Live555流媒体 您拥有的 src 文件通常命名为 live555-latest.tar.gz
解压并编译:
解压:tar xzvf live555-latest.tar.gz
。这将创建一个名为 live 的目录。
cd live
./genMakefiles linux
(如果您有 32 位系统)或./genMakefiles linux-64bit
如果您的系统是 64 位)
make
,过一段时间你就会有一个全新的编译代码
Live55 有很多好东西,但我们只对“testProgs”感兴趣 openRTSP 所在的目录。 OpenRTSP 会让我们接收并发送信号 到 ffmpeg,一个提供 ffserver 的程序。 ffserver 是一个接收 来自 ffmpeg 的信号并将其转换为 SWF(和其他格式)。
下载、解压、配置和安装ffmpeg
从http://www.ffmpeg.org/下载ffmpeg。我测试的版本是0.6.1:http://www.ffmpeg.org/releases/ffmpeg-0.6.1.tar.gz 解压:tar xzvf ffmpeg-0.6.1.tar.gz
。这将创建一个名为 ffmpeg-0.6.1 的目录
cd ffmpeg-0.6.1
所有有趣的视频流都打包在 VideoLan 中。那么你
现在最好安装 VideoLan。转到http://www.videolan.org/ 看看是多么容易
安装它。您可能会对软件包依赖项包含 ffmpeg 库感到惊讶。
安装 VideoLan 后,执行 ./configure
,然后执行 make
。
3 或 4 小时后,您将编译并运行 mmpeg 和 mmserver。
现在我们几乎准备好流式传输整个世界。首先,让我们尝试
让 openRTSP 正常工作。
转到您的“实时”目录(记住 3.2)并执行:cd testProgs
试试这个:./openRTSP -v -c -t rtsp://<hostname>:<port>/<cam_path>
第一个
总而言之,您会看到类似以下内容的日志:
- opening conection blah blah.
- sending DESCRIBE blah blah.
- receiving streamed data.
如果一切顺利,您的控制台将很快开始打印许多奇怪的字符。 这些字符是视频字节,但您(现在)看不到它。如果您没有看到您的屏幕 打印字符,你的配置有问题。检查步骤 到现在。
我们收到信号了!现在让我们将它发送到一个有用的组件:ffmpeg,它绑定到 ff 服务器。我们需要为 ffserver 创建一个配置文件。使用您喜欢的编辑器创建此文本文件:
Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog -
NoDaemon
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 200K
ACL allow 127.0.0.1
</Feed>
<Stream testFlash.swf>
Feed feed1.ffm
Format swf
VideoFrameRate 25
VideoSize 352x288
VideoIntraOnly
NoAudio
</Stream>
<Stream stat.html>
Format status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>
为文件命名,例如,ffserver.conf。将其保存在任何地方,例如在 ffserver 的同一目录中。
所以,ffserver 将绑定到 8090 端口,用于输入和输出。 <Feed>
标签配置
输入流。在这种情况下,配置的提要的名称是 feed1.ffm。请记住第 14 步。
<Stream>
包含输出流的配置。在这种情况下,名称将为 testFlash.swf(请记住),格式为 SWF。视频帧率为 25,大小为 352x288,不包含音频。最后一个流是一个 HTML 文件 (stat.html),它将显示服务器的状态。
启动ffserver: ./ffserver -f ffserver.conf
(或您离开配置文件的任何位置)。 -f 参数表示
您将从自定义文件加载配置。
打开导航器并转到http://localhost:8090/stat.html
。服务器的状态页面将显示,我们将看到一行有关我们的 testFlash.swf 流的信息。现在看起来很安静,所以让我们用 openRTSP 的输出(从第 7 步开始)输入这个流。
这样做:
<path to openRTSP>/openRTSP -v -c -t rtsp://<hostname>:<port>/<cam_path> | <path to ffmeg>/ffmpeg -i - http://localhost:8090/feed1.ffm
第一条路径(“|”之前与步骤9相同。“|”是连接输出的符号
openRTSP(视频信号序列,又名stage chars)作为ffmpeg的输入。 “-I-”表示
mmpeg 的输入取自管道“|” http://localhost:8090/feed1.ffm
是目的地(输出)
ffmpeg的,基本上就是ffserver的输入。
所以通过这个命令我们已经连接了 openRTSP -> ffmpeg -> ffserver
当您输入此命令时,将显示很多信息。重要的是要注意输入参数 并显示输出参数,这些参数需要“兼容”。就我而言,这将显示:
Input #0, h264, from 'pipe: ':
Duration: N/A, bitrate: N/A
Stream #0.0: Video: h264, yuv420p, 352x288, 25 fps, 25 tbr, 1200k tbn, 50 tbc
Output #0, ffm, to 'http://localhost:8090/feed1.ffm':
Metadata:
encoder: Lavf52.64.2
Stream #0.0: Video: FLV, yuv420p, 352x288, q=2-31, 200 kb/s, 1000k tbn, 25 tbc
Stream mapping:
Stream #0.0 -> #0.0
</pre>
然后流开始播放。你会在最后一行看到不断变化的数字, 告诉你每一刻的实时帧率。类似的东西
frame= 395 fps= 37 q=31.7 Lsize = 1404kB time=15.80 bitrate = 727.9kbits/s
如果您没有看到这行指标,则说明您的输出配置有问题。回去修改testFlash.swf的参数。
一切都已完成。您可以在http://localhost:8090/testFlash.swf
观看视频。您可以使用此 URL 嵌入 Flash 电影,或者在我的例子中,嵌入 Flex 应用程序。
【讨论】:
【参考方案4】:Red5 很好,尤其是现在有了 xuggle 支持(允许现成的 FFMPEG 集成),它提供了与 red5 的良好集成(即关于进行实时流转换等的很好的教程)。
【讨论】:
【参考方案5】:如果您熟悉 flex 编程或将其带入 swf 所需的任何东西,那么您可以尝试实现 rtsp-over-tcp,AFAIK udp 在 flash 中不可用。
【讨论】:
【参考方案6】:我刚刚用 Wowza 测试了这个。 输入是来自 Etrovision H264 DVS 的 RTSP 流。 如果您想尝试一下,请查看此踏板并使用 Application.xml 文件: http://96.30.11.104/forums/showthread.php?p=24806
视频在 Flash 播放器中播放,但代价是单流延迟 5 秒,所有设备在办公室局域网中,服务器运行在 Core2Duo/2.8GHz/3GB RAM。 不确定它是否可以更快或者这是此设置的预期转码损坏...
【讨论】:
【参考方案7】:虽然它的公共/开源版本现在有点过时了,但您可以看看这个项目,它使用 Xuggler 和 Red5 将基于 RTSP 和图像的相机转码为 RTMP 流。 http://sourceforge.net/projects/imux/ (免责声明:我为创建原始来源的公司工作)
【讨论】:
哈哈。我实际上是创建 IMUX 的团队/公司的一员 ;-) 很好!以上是关于Flex 中的 RTSP的主要内容,如果未能解决你的问题,请参考以下文章
如何从 QT 中的 RTSP 流中解析 ONVIF 元数据?