原文网站:http://zhaostudy2.blog.163.com/blog/static/1353502052011182538414/
这段时间做实时视频的网页直播遇到了很多困难。
开始时,迫于项目时间的压力,觉得没有足够的时间学习和分析如何将实时视频发送到RTMP流媒体服务器作为实时流,只好使用最粗糙的做法是:先把获取到的实时视频以RTP包的形式 发送给本机,然后本机程序中调用ffmpeg将接收到的RTP包 以RTMP的形式转发到Red5,最后,从网页上获取播放列表,播放实时视频。
这种做法中存在很多问题:(1)多了一层rtp包到rtmp服务器的转发,浪费很多处理器的时间。(2)多了一层转发,系统稳定性很有问题。在视频流转发了一定时间后,ffmpeg会奇怪地停止转发,原因不明。(3)ffmpeg的视频流播放控制难以实现。在网页上停止播放和继续播放视频时,既要控制发送RTP包,又要控制RTMP包,很麻烦。
后来,分析了一下ffmpeg的源代码,发现FFmpeg中对RTMP的支持部分就是使用了RTMPDump中的librtmp。于是,我就打算直接使用librtmp与Red5建立rtmp连接,将实时视频直接发到Red5。
最近过年,在家里闲着,就认真研究一下如何使用librtmp直接将实时视频发送到Red5。我们首先要做的就是编译出librtmp的动态库和静态库。
RTMPDump项目官方网站在:http://rtmpdump.mplayerhq.hu/ 。对RTMP协议的实现在其中librtmp中。这是一个匈牙利人在2009年,Adobe公司还没有公开RTMP协议的情况下对RTMP协议的实现得。 官方网站中只提供了程序源代码和动态链接库(dll),要在开发中方便地使用RTMPDump,还需要自己编译它的静态库(lib)。
==> 编译librtmp静态库
从官方网站http://rtmpdump.mplayerhq.hu/ 下载RTMPDump源代码。
要编译librtmp,还需要另外3个库:zlib、OpenSSL、PolarSSL。
zlib是用于数据压缩的函数库,数据压缩效果比较好,早在1995年就发布了第一版,目前仅支持LZ77变种算法、DEFLATE算法。(http://www.zlib.net/)。
OpenSSL和PolarSSL 是对SSL(Security Socket Layer,加密套接字协议层)的实现。(http://www.openssl.org/ http://polarssl.org/)。
(1)使用VC++6.0新建一个静态库工程,命名为librtmp,如下图所示:
(2)把RTMPDump源代码目录下的librtmp目录下的所有文件 复制到工程目录librtmp\下,并在VC++6.0中的Source Files和Header Files文件夹中添加librtmp相应的文件,如下图所示:
(3)下载zlib开发包 http://download.csdn.net/source/3013660。把其中的zdll.lib、zlib.def、zlib.h、zconf.h放到新建的工程目录librtmp\下。
(4)下载openssl开发包 http://download.csdn.net/source/3013684。把其中的libeay32.lib、ssleay32.lib 及openssl文件夹 复制到工程目录librtmp\下,并在VC++6.0的“工具”->“选项”->“目录”-> “ Include files ”中添加当前的工程目录librtmp\。如下图所示:
(5) 下载PolarSSL源代码 http://download.csdn.net/source/3013696。解压出来,用VC++6.0打开\visualc\polarssl.dsw ,可以编译出静态库(polarssl.lib)。然后将头文件所在的文件夹polarssl\ 和polarssl.lib复制到工程目录librtmp\下。
(6)编译静态库工程,这时会在多个文件中出现这样一个错误: error C2065: '__FUNCTION__' : undeclared identifier 。解决办法是,在存在这个错误的.c文件的中添加一个宏定义:#define __FUNCTION__ "" 。问题就解决了。再编译工程即可得到librtmp.lib,如下图所示:
(7)但是,这样编译出来的librtmp.lib在使用的时候会出现很多个外部符号未定义的错误。如下图所示:
这是librtmp的条件编译导致的问题,解决方法是:在rtmp_sys.h中把代码:
#ifdef _XBOX
#include <xtl.h>
#include <winsockx.h>
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf
#else /* !_XBOX */
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
改为
#include <winsock2.h>
#include <ws2tcpip.h>
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf
然后,删除rtmp.c中的如下代码:
#ifdef _DEBUG
fwrite(buf, 1, len, netstackdump);
#endif
和
#ifdef _DEBUG
extern FILE *netstackdump;
extern FILE *netstackdump_read;
#endif
和
#ifdef _DEBUG
fwrite(ptr, 1, nBytes, netstackdump_read);
#endif
(8)编译rtmp.c即可得到librtmp.lib
我已经将rtmpdump编译好的静态库、动态库以及源代码打成一个包,放到 http://download.csdn.net/source/3014336。如果不想自己编译,可以从这里下载,也可以直接下载下面的附件。
分享到:
相关推荐
**Windows下的编译** 在Windows环境下编译Nginx和其扩展模块可能需要一些额外的步骤,因为Nginx通常是为Linux环境设计的。这包括安装Visual Studio编译器、下载必要的依赖库,如pthreads和zlib,以及配置编译选项。...
在压缩包中的"rtmpdump-2.3"可能是rtmpdump的源代码或者编译好的二进制文件,用户可以进一步查看源码理解其工作原理,或者直接在Android设备上使用编译后的二进制文件进行流媒体操作。对于开发者来说,这为自定义...
对于Windows开发者来说,这简化了在该平台上集成rtmpdump和librtmp到他们的项目中的过程。 rtmpdump-2.3压缩包可能包含了以下内容: 1. rtmpdump源代码:这是工具的源代码,程序员可以查看并理解其工作原理,或者...
标题"librtmp库实测可在Linux下进行交叉编译"指出,librtmp库,一个通常用于RTMP协议处理的开源库,能够在Linux环境中完成交叉编译的过程。这意味着开发者可以在Linux系统上构建适用于其他平台(如嵌入式设备或不同...
在编译rtmpdump时,需要将librtmp_src文件夹中的源代码与其他依赖库合并,并配置合适的编译选项。对于Windows环境,这通常涉及设置项目属性、链接库路径和包含目录。完成编译后,将生成rtmpdump可执行文件,可用于与...
本文将详细介绍在Linux环境下编译并使用的rtmpdump-2.3工具,帮助你理解其工作原理,以及如何利用它来播放RTMP视频。 rtmpdump是一款轻量级的开源工具,主要用于抓取、记录和回放RTMP流。它的功能强大,可以在多种...
rtmpdump是一款开源的命令行工具,主要用于从RTMP(Real-Time Messaging Protocol)服务器上下载流媒体内容,如直播视频或音频。这个资源包是rtmpdump的2.4版本,适用于Linux操作系统,特别是针对树莓派平台进行了...
这个源码包 "nginx-rtmp-module-master" 包含了 Nginx-RTMP 模块的源代码,对于运维人员来说,了解并掌握其工作原理和配置方法对于搭建和维护实时流媒体服务器至关重要。 **一、Nginx 简介** Nginx 是一款高性能的 ...
采用开源的RTMPDUMP开发的一个发布端实例,RTMPDUMP本身有下载实例,这个是发布端的。需要的朋友可以参考一下
标题中的“推多路流-资源-windows使用-obs-multi-rtmp-portable”指的是使用OBS(Open Broadcaster Software)在Windows操作系统上实现多路RTMP流推送的功能。OBS是一款开源、免费的屏幕录制与直播软件,广泛应用于...
《rtmpdump在Visual Studio 2008下的移植与应用》 rtmpdump是一款开源的命令行工具,主要用于从RTMP(Real Time Messaging Protocol)流媒体服务器上下载或播放音视频内容。它由Hans-Christoph Steiner和Ingo von ...
RTMP是Adobe Systems开发的协议,广泛应用于在线直播、视频发布等场景。 rtmpdump是一款开源工具,用于抓取和回放RTMP流,其功能包括下载RTMP流到本地文件或将其重定向到其他地方。在海思3516v300这样的硬件平台上...
RTMP(Real Time Messaging Protocol)是由Adobe Systems开发的协议,主要用于实时音频、视频数据的传输。它常用于在线直播、视频会议等场景,支持FLV(Flash Video)和H.264等编码格式。RTMP协议基于TCP,并且通过...
在IT领域,尤其是网络视频流处理和直播服务中,RTMP协议扮演着至关重要的角色,因为它允许用户实时传输和接收音频、视频和其他数据。而RTMPDump则是开发者研究、调试和分析RTMP协议的首选工具。 这个项目是基于...
nginx-rtmp-win64;nginx-rtmp-win64 nginx-rtmp-win64 nginx-rtmp-win64 nginx-rtmp-win64 nginx-rtmp-win64nginx-rtmp-win64
RTMP(Real Time Messaging Protocol)是由Adobe Systems开发的一种用于实时数据传输的协议,广泛应用于在线直播和视频点播服务。rtmpdump通过解析RTMP协议的握手过程、命令消息和数据块,实现了对流媒体内容的捕获...
rtmpdump是一款强大的开源工具,主要用于从RTMP(Real-Time Messaging Protocol)服务器上抓取流媒体内容。RTMP是一种广泛用于在线视频传输的协议,由Adobe Systems开发。rtmpdump的2.4版本是我们讨论的重点。 这个...
在Windows环境下编译`nginx-http-flv-module`是一项技术性的任务,主要目的是为了实现HTTP FLV协议的直播功能,使得用户可以通过浏览器中的FLVJS库或者无插件Flash播放器来观看直播内容。这个模块是Nginx的一个扩展...
编译rtmpdump时,你需要确保你有正确的开发环境,例如Visual Studio 2010,因为它是一个Windows下的项目。在VC2010中打开源代码,设置工程配置,链接所需的库(例如librtmp),然后编译项目。如果一切顺利,你应该...
在压缩包中,"static-librtmp-nossl-pc"文件很可能是预编译的静态库文件,适用于个人计算机平台,例如Windows、Linux或macOS。根据你的开发环境,你可以将这个库链接到你的项目中,使用librtmp提供的API来发布流到...