librtmp-Android

原文地址:https://juejin.cn/post/6844904000542736392
RTMPDump 用来处理 RTMP 流媒体的开源工具包。能够单独使用 RTMP 通信,也可以集成到 FFmpeg 中通过 FFmpeg 接口来使用 RTMPDump。

下载地址:http://rtmpdump.mplayerhq.hu/

介绍两种方式引入 RTMPDump 的方式,一种使用 NDK 提供的交叉编译工具来进行编译成静态库再引入,第二种源码集成。实际场景中可自行选择,如果源码不多的情况下推荐使用源码集成的方式。不过有时候我们需要大量引入 C/C++ 库,这个时候还是考虑使用静态库的方式,这样源文件就不显得很多。

....

# 编译工具 gcc, 但是我在用 mac 时会使用 clang 替代,具体看我后面编译脚本。
CC=$(CROSS_COMPILE)gcc
# 链接器
LD=$(CROSS_COMPILE)ld

# 目标系统
SYS=posix
#SYS=mingw

# Openssl 加密,因为 RTMP 流媒体协议支持双向加密
CRYPTO=OPENSSL
#CRYPTO=POLARSSL
#CRYPTO=GNUTLS
LIBZ=-lz
LIB_GNUTLS=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ)
LIB_OPENSSL=-lssl -lcrypto $(LIBZ)
LIB_POLARSSL=-lpolarssl $(LIBZ)
CRYPTO_LIB=$(LIB_$(CRYPTO))
DEF_=-DNO_CRYPTO
CRYPTO_DEF=$(DEF_$(CRYPTO))

DEF=-DRTMPDUMP_VERSION=\"$(VERSION)\" $(CRYPTO_DEF) $(XDEF)
OPT=-O2
# 编译参数 XCFLAGS 会从外部指定.
CFLAGS=-Wall $(XCFLAGS) $(INC) $(DEF) $(OPT)
LDFLAGS=-Wall $(XLDFLAGS)

......

LIBRTMP=librtmp/librtmp.a
INCRTMP=librtmp/rtmp_sys.h librtmp/rtmp.h librtmp/log.h librtmp/amf.h

......

PROGS=rtmpdump rtmpgw rtmpsrv rtmpsuck

# 依赖两个目标:LIBRTMP 和 PROGS, 由于我们生成的是 Android 平台,所以这里我们不关心 PROGS,后面我会删掉这个目标。
all:    $(LIBRTMP) $(PROGS)

$(PROGS): $(LIBRTMP)

# 安装,创建文件、复制文件到指定目录
install:    $(PROGS)
    -mkdir -p $(BINDIR) $(SBINDIR) $(MANDIR)/man1 $(MANDIR)/man8
    cp rtmpdump$(EXT) $(BINDIR)
    cp rtmpgw$(EXT) rtmpsrv$(EXT) rtmpsuck$(EXT) $(SBINDIR)
    cp rtmpdump.1 $(MANDIR)/man1
    cp rtmpgw.8 $(MANDIR)/man8
    @cd librtmp; $(MAKE) install

clean:
    rm -f *.o rtmpdump$(EXT) rtmpgw$(EXT) rtmpsrv$(EXT) rtmpsuck$(EXT)
    @cd librtmp; $(MAKE) clean

FORCE:

# 执行 librtmp 目录下的 Makefile 文件.
$(LIBRTMP): FORCE
    @cd librtmp; $(MAKE) all

# 调用编译器编译生成 rtmpdump.o
rtmpdump: rtmpdump.o
    $(CC) $(LDFLAGS) -o $@$(EXT) $@.o $(LIBS)

....

librtmp 目录下的 Makefile.

......

# CC 编译器
CC=$(CROSS_COMPILE)gcc
# 链接器
LD=$(CROSS_COMPILE)ld
# ar 打包
AR=$(CROSS_COMPILE)ar

# 目标系统
SYS=posix
# OPENSSL 加密.
CRYPTO=OPENSSL
#CRYPTO=GNUTLS
DEF_POLARSSL=-DUSE_POLARSSL
DEF_OPENSSL=-DUSE_OPENSSL
DEF_GNUTLS=-DUSE_GNUTLS
DEF_=-DNO_CRYPTO
REQ_GNUTLS=gnutls,hogweed,nettle
REQ_OPENSSL=libssl,libcrypto
PUB_GNUTLS=-lgmp
LIBZ=-lz
LIBS_posix=
LIBS_darwin=
LIBS_mingw=-lws2_32 -lwinmm -lgdi32
LIB_GNUTLS=-lgnutls -lhogweed -lnettle -lgmp $(LIBZ)
LIB_OPENSSL=-lssl -lcrypto $(LIBZ)
LIB_POLARSSL=-lpolarssl $(LIBZ)
PRIVATE_LIBS=$(LIBS_$(SYS))
CRYPTO_LIB=$(LIB_$(CRYPTO)) $(PRIVATE_LIBS)
CRYPTO_REQ=$(REQ_$(CRYPTO))
CRYPTO_DEF=$(DEF_$(CRYPTO))
PUBLIC_LIBS=$(PUB_$(CRYPTO))

......

SHARED=yes
......

DEF=-DRTMPDUMP_VERSION=\"$(VERSION)\" $(CRYPTO_DEF) $(XDEF)
OPT=-O2
CFLAGS=-Wall $(XCFLAGS) $(INC) $(DEF) $(OPT) $(SO_DEF)
LDFLAGS=$(XLDFLAGS)


OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o

# 生成 librtmp.a 以及动态库
all:    librtmp.a $(SO_LIB)

clean:
    rm -f *.o *.a *.$(SOX) *$(SO_EXT) librtmp.pc

# 目标依赖于 OBJS
librtmp.a: $(OBJS)
    $(AR) rs $@ $?

librtmp$(SO_EXT): $(OBJS)
    $(CC) $(SO_LDFLAGS) $(LDFLAGS) -o $@ $^ $> $(CRYPTO_LIB)
    ln -sf $@ librtmp.$(SOX)

# 生成目标的规则.
log.o: log.c log.h Makefile
rtmp.o: rtmp.c rtmp.h rtmp_sys.h handshake.h dh.h log.h amf.h Makefile
amf.o: amf.c amf.h bytes.h log.h Makefile
hashswf.o: hashswf.c http.h rtmp.h rtmp_sys.h Makefile
parseurl.o: parseurl.c rtmp.h rtmp_sys.h log.h Makefile

librtmp.pc: librtmp.pc.in Makefile
    sed -e "s;@prefix@;$(prefix);" -e "s;@libdir@;$(libdir);" \
        -e "s;@VERSION@;$(VERSION);" \
        -e "s;@CRYPTO_REQ@;$(CRYPTO_REQ);" \
        -e "s;@PUBLIC_LIBS@;$(PUBLIC_LIBS);" \
        -e "s;@PRIVATE_LIBS@;$(PRIVATE_LIBS);" librtmp.pc.in > $@

install:    install_base $(SO_INST)

install_base:   librtmp.a librtmp.pc
    -mkdir -p $(INCDIR) $(LIBDIR)/pkgconfig $(MANDIR)/man3 $(SODIR)
    cp amf.h http.h log.h rtmp.h $(INCDIR)
    cp librtmp.a $(LIBDIR)
    cp librtmp.pc $(LIBDIR)/pkgconfig
    cp librtmp.3 $(MANDIR)/man3
    
......


整体流程大概分析一下,告诉了我们编译规则和依赖,以及安装目录。那么接下来编写 NDK 交叉编译脚本,基于 Mac 平台编写,linux 更改一下工具链位置。

#!/bin/bash
# 将NDK的路径替换成你自己的NDK路径
NDK_ROOT=/Users/liangchuanfei/Documents/Android/SDK/android-ndk-r16b

# 设置工具链mac苹果电脑的是darwin-x86_64 而如果是linux的话则是linux-x86_64

TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64

CPU=arm-linux-androideabi

export XCFLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC"
export XLDFLAGS="--sysroot=${NDK_ROOT}/platforms/android-21/arch-arm "
export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-

# XDEF=-DNO_SSL 的意思是不实用SSL,因为rtmp内部使用了SSL,如果开启的话需要编译链接SSL的库
make install SYS=android prefix=`pwd`/install CRYPTO= SHARED=  XDEF=-DNO_SSL

然后增加执行权限:

chmod +x build_rtmp.sh

编译错误:

解: 把rtmpdump.c文件的宏定义 ftello64 和 fseeko64 注释调了


测试

add_library(rtmp STATIC IMPORTED)
set_target_properties(rtmp PROPERTIES IMPORTED_LOCATION /xx/librtmp.a)

CMakeList.txt 添加静态库


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,812评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,626评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,144评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,052评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,925评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,035评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,461评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,150评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,413评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,501评论 2 307
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,277评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,159评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,528评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,868评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,143评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,407评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,615评论 2 335

推荐阅读更多精彩内容