rtmpdump主頁 ,rtmpdump庫主要包含三部分:
1、乙個基本的客戶端程式
2、兩個伺服器程式(rtmpsrv、rtmpsuck)
3、乙個支援rtmp協議的庫—librtmp
git clone git:
下面主要介紹librtmp和librtmp的編譯
librtmp庫提供了大量客戶端函式和少部分的伺服器端的函式用來支援rtmp、rtmpt(rtmp使用http通道),rtmpe(加密的rtmp),rtmps(基於ssl/tls的rtmp)和rtmpte、rtmpts(使用http通道的加密和基於ssl/tls的rtmp)協議
使用librtmp通過rtmp[t][e|s]
協議進行一次流**互動的基本過程為:
推流端:
rtmp_alloc() -建立乙個rtmp會話控制代碼
rtmp_init() -初始化rtmp控制代碼
rtmp_setupurl() -設定推流rtmp url
rtmp_enablewrite() -配置該**流可進行寫操作
rtmp_connect() -建立rtmp網路連線
rtmp_connectstream() -建立rtmp流連線
rtmp_write() -對該**流進行寫入流**資訊
rtmp_close() -關閉rtmp連線
rtmp_free() -釋放此次連線的會話控制代碼
rtmp_alloc() -建立乙個rtmp會話控制代碼
rtmp_init() -初始化rtmp控制代碼
rtmp_setupurl() -設定拉流rtmp url
rtmp_connect() -建立rtmp網路連線
rtmp_connectstream() -建立rtmp流連線
rtmp_read() -讀取**流資料,返回0時則**流讀取完畢
rtmp_pause() -暫停讀取**流資料或取消暫停(options)
rtmp_close() -當**流讀取完畢後進行rtmp連線的關閉
rtmp_free() -釋放此次連線的會話控制代碼
上述方法的具體實現可以在librtmp包中的rtmp.c
檔案中找到,同時,它還提供了其它眾多方法來處理rtmp的流**互動過程
乙個基本的rtmp url格式為:
和http類似,不過某些地方不一樣,下面簡單說說:
scheme為rtmp或者rtmp協議的諸多變種之一,這就不需要多解釋了,像websocket協議scheme為ws或者wss,http協議scheme為http或https。
host為主機名,後面緊接著為埠號,如果不指定,rtmp協議預設埠號為1935.
當然也可以追加額外的引數,只不過這和我們使用http協議追加引數的方式不同,librtmp是採取空格為分隔符,通過追加」key=value」的方式進行追加額外的引數,如:
關於librtmp的更多額外的引數配置,可以看 librtmp文件
編譯librtmp,在librtmp目錄下新建android.mk檔案,內容如下:
local_path:= $(call my-dir)關於mk檔案的編寫和引數配置,可以閱讀 mk官網文件 ,上面也給出了全部編譯時引數配置的注釋,由於上面配置加入了include $(clear_vars)
# 編譯模組輸出的名稱
local_module := rtmp
# 編譯所需的標頭檔案路徑
local_c_includes += \
$(local_path)/
#$(local_path)/../openssl/include/ #鏈結openssl庫
# 編譯所需的原始檔路徑
local_src_files := \
amf.c \
log.c \
parseurl.c \
rtmp.c \
hashswf.c
# 編譯時候需要鏈結的動態庫庫存在靜態庫形式,將會鏈結到對應的靜態庫而不是動態庫
# local_force_static_executable := true
# 新增編譯配置選項,一些常用編譯配置:
# -fpic:編譯位置無關的**,一般用於編譯動態庫
# -02:編譯優化程度
# -l***:鏈結名為lib***庫
# -i新增編譯器搜尋-l指定的庫檔案的搜尋
# -d:加入巨集定義,如:no_crypto,不使用加密
local_cflags += -drtmpdump_version=v2.4 -dno_crypto -wall -fpic -o2
#local_cflags += -i$(local_path)/../openssl -lssl -lcrypto #可選新增openssl支援,需去除-dno_crypto
local_ldlibs += -lz
# include $(build_static_library)
include $(build_shared_library)
no_crypto
定義,沒有鏈結openssl庫,需要的可以自己加或者使用 polarssl 、gnutls 來替代 openssl
然後在rtmpdump目錄下也建立個android.mk檔案,內容為:
local_path := $(call my-dir)其實不需要這個也行,不過加入該檔案目的是為了能夠統一rtmpdump資料夾下和子目錄中的mk的編譯執行入口,這樣只需呼叫這乙個mk檔案即可,上面配置的只會執行librtmp目錄下的mk檔案,如果需要加入其它的,則在include $(clear_vars)
subdirs := $(addprefix $(local_path)/,$(addsuffix /android.mk, \
librtmp \
))include $(subdirs)
subdirs
中加入即可,如:
subdirs := $(addprefix $(local_path)/,$(addsuffix /android.mk, \librtmp \
otherdir \
))
ndk_toolchain_version := 4.9
#!/bin/bash其中ndk路徑替換為自己的即可,開始編譯:ndk=$home/library/android/sdk/ndk-bundle
cd rtmpdump成功後,可以在rtmpdump目錄下看到obj和libs兩個資料夾,libs存放著編譯出來的動態庫,而obj則是存放靜態庫,這取決於所配置的是./build_librtmp.sh
build_shared_library
還是build_static_library
當然其它庫也可以用這種方式進行編譯
由於ffmpeg本身預設自帶就支援rtmp、rtmpt協議,不過也可以擴充套件以便支援rtmp協議的多種變種協議(rtmps、rtmpt、rtmpts、rtmpte和rtmpe協議),在ffmpeg加入openssl庫的支援,可以支援rtmps、rtmpts協議,加入libgcrypt庫的支援,可以支援rtmpe、rtmpte協議,這樣支援相對麻煩,可以直接使用librtmp來支援rtmp以及它的多種變種協議,可通過鏈結librtmp庫來支援
ppp與pppoe 交叉編譯移植
交叉編譯鏈為 arm hismall linux 1 arm linux 核心支援 ppp 2 install ppp 2.4.4 rp pppoe 要ppp 的支援才能正常執行 3 install rp pppoe。4 把步驟 2 3 有的文件說需要 交叉編譯 libcap www.tcpdump...
移植 交叉編譯zeroMQ與pyzmq
因為專案需要,需要將pyzmq第三方包移植到arm板,這樣會涉及zeromq與pyzmq兩個庫的交叉編譯。當然,有快捷的方法 1.直接使用arm板連線外網,直接安裝zeromq與pyzmq,可以參考官網guide或參考 2.我們這裡使用的方法是,zeromq在虛擬機器編譯,pyzmq在開發板上編譯。...
rtmpdump在vs2015下的編譯
這裡就不對編譯錯誤進行截圖了,直接上解決方案。第一步修改rtmp sys.h檔案,將 win32巨集下 的內容修改為以下內容 include include if defined msc ver msc ver 1900 msvc define snprintf snprintf define vs...