我们目前正在开发一个 Flex 应用程序,该应用程序需要通过 RTSP 连接到一组交通检测摄像机。总的来说,我对视频流的世界是全新的,我想知道这是否可能。
AFAIK 无法在 Flash 播放器中使用 RTSP 提要,所以我认为我们需要在服务器上安装某种转换器,接收 RTSP 流并将其转换为 RTMP,以便我们可以在我们的弹性应用程序。我们希望 Red5 可以帮助我们做到这一点。
我的假设是否正确,有人这样做过吗?
我们目前正在开发一个 Flex 应用程序,该应用程序需要通过 RTSP 连接到一组交通检测摄像机。总的来说,我对视频流的世界是全新的,我想知道这是否可能。
AFAIK 无法在 Flash 播放器中使用 RTSP 提要,所以我认为我们需要在服务器上安装某种转换器,接收 RTSP 流并将其转换为 RTMP,以便我们可以在我们的弹性应用程序。我们希望 Red5 可以帮助我们做到这一点。
我的假设是否正确,有人这样做过吗?
Wowza Media 似乎支持 RTSP 到 RTMF 的转换:http ://www.wowzamedia.com/comparison.html
还有基于Red5和FFMPEG的通用视频流转码器Xuggle http://www.xuggle.com/ 。
基于这项工作 ,我尝试将 H264 信号转换为可以在 Flash 中轻松显示的 SWF 流。这是食谱。(这个配方适用于 Linux。)
下载 Live555 流媒体,从http://www.live555.com/liveMedia/ 你拥有的 src 文件通常命名为 live555-latest.tar.gz
解压并编译:
tar xzvf live555-latest.tar.gz
。这将创建一个名为 live 的目录。cd live
./genMakefiles linux
(如果您有 32 位系统)或者./genMakefiles linux-64bit
如果您的系统是 64 位)make
, 一段时间后你会有一个全新的编译代码Live55 有很多好东西,但我们只对 openRTSP 所在的“testProgs”目录感兴趣。OpenRTSP 将让我们接收信号并将其发送到 ffmpeg,这是一个为 ffserver 提供数据的程序。ffserver 是一个服务器,它接收来自 ffmpeg 的信号并将其转换为 SWF(和其他格式)。
下载、解压、配置和安装ffmpeg
tar xzvf ffmpeg-0.6.1.tar.gz
。这将创建一个名为 ffmpeg-0.6.1 的目录cd ffmpeg-0.6.1
./configure
,然后make
.转到您的“实时”目录(记住 3.2)并执行:cd testProgs
试试这个:./openRTSP -v -c -t rtsp://<hostname>:<port>/<cam_path>
首先,你会看到这样的日志:
- opening conection blah blah.
- sending DESCRIBE blah blah.
- receiving streamed data.
如果一切顺利,您的控制台将很快开始打印许多奇怪的字符。这些字符是视频字节,但您(现在)看不到它。如果您没有看到您的丝网印刷字符,则说明您的配置有问题。检查到目前为止的步骤。
使用您喜欢的编辑器创建此文本文件:
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 应用程序。
您可以尝试通过 Red5 重新流式传输并将您的 Flex 应用程序连接到 Red5 服务器。
如果您熟悉 flex 编程或将其带入 swf 所需的任何东西,那么您可以尝试实现 rtsp-over-tcp,AFAIK udp 在 flash 中不可用。
我刚刚用 Wowza 测试了这个。输入是来自 Etrovision H264 DVS 的 RTSP 流。如果您想尝试一下,请查看此步骤并使用 Application.xml 文件:http: //96.30.11.104/forums/showthread.php?p= 24806
视频在 Flash 播放器中播放,但代价是单条流延迟 5 秒,所有设备在办公室局域网中,服务器运行在 Core2Duo/2.8GHz/3GB RAM。不确定它是否可以更快,或者这是此设置的预期转码损坏...
Red5 很好,尤其是现在有了 xuggle 支持(允许现成的 FFMPEG 集成),它提供了与 red5 的良好集成(即关于进行实时流转换等的很好的教程)。
虽然它的公共/开源版本现在有点过时了,但您可以看看这个项目,它使用 Xuggler 和 Red5 将基于 RTSP 和图像的相机转码为 RTMP 流。
http://sourceforge.net/projects/imux/
(免责声明:我为创建原始源代码的公司工作)