用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)
根據
可以去掉這個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";


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章