用librtmp 接收数据

使用librtmp 接收RTMP流的流程图如下:

注意用到的函数有:

InitSockets(): 初始化Socket
RTMP_Alloc()  :为结构体“RTMP”分配内存
RTMP_Init():初始化结构体“RTMP”中的成员变量
RTMP_SsetupURL(): 设置输入的RTMP连接的URL
RTMP_Connect(): 建立RTMP连接,创建一个RTMP协议规范的NetConnection
RTMP_ConnectStream(): 创建一个RTMP协议规范中的NetStream
RMTP_Read():从服务器读取数据
RTMP_Close():关闭RMTP连接
RTMP_FREE():释放结构体"RTMP",与RTMP_Alloc 对应
CleanupSockets(): 关闭Socket

在编译过程中,需要注意以下几点:

1.把librtmp文件夹拷贝到工程的上一级目录下,即vcxproj文件的上一级目录的位置
【为什么是上一级目录比较好呢?因为这些不属于这个工程的,与该工程是并列的,】
2.在源文件中,把librmtp的cpp加进来
3.这个时候发现找不到openssl的相关东西,把OpenSSL的文件夹拷贝到工程文件的上一级目录,并且在工程属性--》C/C++ --》常规  里面把相关的目录加进来,

同时把其他几个文件夹也拷贝进来:stdint  zlib.
所添加的目录如下:

..\OpenSSL-Win32\include;..\stdint;..\zlib\include; 


4.这个时候,提示找不到 外部符号
1>rtmp.obj : error LNK2019: 无法解析的外部符号  __imp__closesocket@4,该符号在函数 _RTMPSockBuf_Close 中被引用
此时,要设置lib的路径。
工程属性--》链接器--》
..\OpenSSL-Win32\lib\VC;..\zlib\lib;
需要的lib有
zlib.lib;ssleay32MT.lib;libeay32MT.lib;Ws2_32.lib;

=================
5.发现zlib的几个文件还没有放到工程里,出现以下错误:

1>hashswf.obj : error LNK2019: 无法解析的外部符号 _inflateEnd,该符号在函数 _RTMP_HashSWF 中被引用
1>hashswf.obj : error LNK2019: 无法解析的外部符号 _inflateInit_,该符号在函数 _RTMP_HashSWF 中被引用
1>hashswf.obj : error LNK2019: 无法解析的外部符号 _inflate,该符号在函数 "unsigned int __cdecl swfcrunch(void *,unsigned int,unsigned int,void *)" (?swfcrunch@@ YAIPAXII0@Z) 中被引用
1>rtmp.obj : error LNK2001: 无法解析的外部符号 "struct _iobuf * netstackdump_read" (?netstackdump_read@@3PAU_iobuf@@A)
1>rtmp.obj : error LNK2001: 无法解析的外部符号 "struct _iobuf * netstackdump" (?netstackdump@@3PAU_iobuf@@A)
1>F:\rtmp\rtmpCode\rtmpReceive\Debug\rtmpReceive.exe : fatal error LNK1120: 5 个无法解析的外部命令

加进来几个zlib的文件, 3个。  adler32.c   crc32.c   inflate.c
因为看到inflate,找到这个属于zlib的。
==========================
1>rtmp.obj : error LNK2001: 无法解析的外部符号 "struct _iobuf * netstackdump_read" (?netstackdump_read@@3PAU_iobuf@@A)
1>rtmp.obj : error LNK2001: 无法解析的外部符号 "struct _iobuf * netstackdump" (?netstackdump@@3PAU_iobuf@@A)
根据
http://blog.sina.com.cn/s/blog_62949ff40101efk1.html 这个链接
可以去掉这个netstackdump_read 的定义。
这样可以。
===========================
但是流出不来。
ERROR: Problem accessing the DNS. (addr: live.hkstv.tv.lxdns.com)
DNS 不对
但是用ffmpeg 是可以的。
URL 写错了!!!!!!
正确的是
char *url = "rtmp://live.hkstv.hk.lxdns.com/live/hks";


你可能感兴趣的:(rtmp)