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 端口,用于输入和输出。 &lt;Feed&gt; 标签配置 输入流。在这种情况下,配置的提要的名称是 feed1.ffm。请记住第 14 步。 &lt;Stream&gt; 包含输出流的配置。在这种情况下,名称将为 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的主要内容,如果未能解决你的问题,请参考以下文章

Android 中的 RTSP 客户端

如何从 QT 中的 RTSP 流中解析 ONVIF 元数据?

javascript中的RTP RTSP实现

使用 ffmpeg 从 C++ 内存中的多个图像流式传输 RTSP

将RTSP流保存到android中的mp4文件

Flex 中的 StringBuilder