簡述RTMPDump與編譯移植

2021-09-07 13:09:34 字數 3683 閱讀 6706

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)

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)

關於mk檔案的編寫和引數配置,可以閱讀 mk官網文件 ,上面也給出了全部編譯時引數配置的注釋,由於上面配置加入了no_crypto定義,沒有鏈結openssl庫,需要的可以自己加或者使用 polarssl 、gnutls 來替代 openssl

然後在rtmpdump目錄下也建立個android.mk檔案,內容為:

local_path := $(call my-dir)

include $(clear_vars)

subdirs := $(addprefix $(local_path)/,$(addsuffix /android.mk, \

librtmp \

))include $(subdirs)

其實不需要這個也行,不過加入該檔案目的是為了能夠統一rtmpdump資料夾下和子目錄中的mk的編譯執行入口,這樣只需呼叫這乙個mk檔案即可,上面配置的只會執行librtmp目錄下的mk檔案,如果需要加入其它的,則在subdirs中加入即可,如:

subdirs := $(addprefix $(local_path)/,$(addsuffix /android.mk, \

librtmp \

otherdir \

))

ndk_toolchain_version := 4.9
#!/bin/bash

ndk=$home/library/android/sdk/ndk-bundle

其中ndk路徑替換為自己的即可,開始編譯:

cd rtmpdump

./build_librtmp.sh

成功後,可以在rtmpdump目錄下看到obj和libs兩個資料夾,libs存放著編譯出來的動態庫,而obj則是存放靜態庫,這取決於所配置的是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...