用Delphi实现基于RTMP协议的多媒体直播系统

12 Comments 2013-11-09 admin

        周末了,来一篇关于RTMP协议的东西。RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议。它有三种变种:

        1)工作在TCP之上的明文协议,使用端口1935;

        2)RTMPT封装在HTTP请求之中,可穿越防火墙;

        3)RTMPS类似RTMPT,但使用的是HTTPS连接;

        基于RTMP协议的直播系统一般由三部分组成:采集推送端(实现数据采集和发送)、服务器端(接收推送端数据,并传输给播放端)、播放端(从服务器端接收并播放)。服务器一般不用自己写,因为开源和商业的都非常多,简单列举如下:

一、开源项目

项目名称        开发语言        项目地址

red5                   Java           http://code.google.com/p/red5/
crtmpserver      C++           http://www.rtmpd.com
ErlyVideo          erlong        https://github.com/erlyvideo/erlyvideo
haXeVideo       haXe           http://code.google.com/p/haxevideo/
FluorineFx       .NET            http://www.fluorinefx.com/

二、商业程序

程序名称                                     所属公司                                                  地址
FMS                                               Adobe                                           http://www.adobe.com/products/flash-media-server-family.html
Wowza Media Server                 Wowza Media Systems             http://www.wowza.com/media-server
Helix                                             Real Network                               http://www.realnetworks.com/helix/streaming-media-server/
Evostream Media Server          EvoStream                                   http://www.evostream.com/

        当然,还有一些其他的开源、商业rtmp服务器(如ffserver),就不一一列举了。一般来说,商业rtmp程序要比开源程序支持更多的协议以及更多的平台。

        虽然Adobe也在官方网站已经提供了RTMP协议的官方文档,但根据网上实际开发过的人写的文章说:“Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的”。幸好有个开源项目RTMPDUMP(http://rtmpdump.mplayerhq.hu/),RTMPDump是一个匈牙利人的作品。他在Adobe未公开RTMP协议的条件下,写出了针对RTMP协议的客户端程序。他和Adobe的故事,大家也可以在网上看看。后来又有个叫Faris Khowarizmi的人写了针对librtmp(RTMPDump的核心Dll)的Delphi头文件paslibrtmp,所以现在使用Delphi来开发就方便多了。不过他翻译的文件中有一个结构翻译错误了,具体是TRTMPPacket结构里面的m_hasAbsTimestamp,他定义为DWORD类型了,实际上应该是BYTE类型,这个如果错误的话,则后面会全部错误。

        下面说一下推送流程:
        1、采集视频和音频数据,然后编码。我这里是使用H264压缩视频,AAC压缩音频。
        2、连接RTMP服务器,发送视频(如果有)的初始信息和音频的初始化信息。例如:视频的大小、音频的频率声道之类。
        3、循环把第一步的数据发送给RTMP服务器。
        最后效果如下:
        推送端:
rtmp1
        播放效果:
rtmp2

        经过实际测试,RTMP协议在互联网的话延迟大概在2秒左右,局域网的话则延迟不大。点这里下载paslibrtmp,点这里下载演示程序,相关问题请加QQ群讨论,另外群共享里面也有一些相关的代码。

分类:多媒体相关

12 Comments 发表评论

发表评论

(required)

(required), (Hidden)

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

TrackBack URL  |  RSS feed for comments on this post.


日历

2023年 9月
 123
45678910
11121314151617
18192021222324
252627282930  

近期文章